home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / INTER53B.ZIP / INTERRUP.E < prev    next >
Text File  |  1997-01-12  |  359KB  |  9,495 lines

  1. Interrupt List, part 5 of 16
  2. Copyright (c) 1989,1990,1991,1992,1993,1994,1995,1996,1997 Ralf Brown
  3. --------D-2110-------------------------------
  4. INT 21 - DOS 1+ - CLOSE FILE USING FCB
  5.     AH = 10h
  6.     DS:DX -> File Control Block (see #0693)
  7. Return: AL = status
  8.         00h successful
  9.         FFh failed
  10. Notes:    a successful close forces all disk buffers used by the file to be
  11.       written and the directory entry to be updated
  12.     not supported by MS Windows 3.0 DOSX.EXE DOS extender
  13. SeeAlso: AH=0Fh,AH=16h,AH=3Eh
  14. --------D-2111-------------------------------
  15. INT 21 - DOS 1+ - FIND FIRST MATCHING FILE USING FCB
  16.     AH = 11h
  17.     DS:DX -> unopened FCB (see #0693), may contain '?' wildcards
  18. Return: AL = status
  19.         00h successful
  20.         [DTA] unopened FCB for first matching file
  21.         FFh no matching filename, or bad FCB
  22. Notes:    the type of the returned FCB depends on whether the input FCB was a
  23.       normal or an extended FCB
  24.     the data returned in the DTA (disk transfer area) is actually the
  25.       drive number (or extended FCB header and drive number) followed by
  26.       the file's directory entry (see #0700); this format happens to be
  27.       compatible with an unopened FCB
  28.     for extended FCBs with search attribute 08h, the volume label (if any)
  29.       will be returned even if the current directory is not the root dir.
  30.     DOS 3.0+ also allows the '*' wildcard
  31.     the search FCB must not be modified if AH=12h will be used to continue
  32.       searching; DOS 3.3 has set the following parts of the FCB:
  33.          0Ch    BYTE    ???
  34.          0Dh    WORD    directory entry number of matching file
  35.          0Fh    WORD    cluster number of current directory
  36.          11h  4 BYTEs    ???
  37.          15h    BYTE    drive number (1=A:)
  38.     this function is used by many copy protection schemes to obtain the
  39.       starting cluster of a file
  40. SeeAlso: AH=12h,AH=1Ah,AH=4Eh,INT 2F/AX=111Bh
  41.  
  42. Format of DOS directory entry:
  43. Offset    Size    Description    (Table 0700)
  44.  00h  8 BYTEs    blank-padded filename
  45.  08h  3 BYTEs    blank-padded file extension
  46.  0Bh    BYTE    attributes
  47.  0Ch 10 BYTEs    (MS-DOS 1.0-6.22) reserved
  48.         (DR-DOS) used to store file password
  49.         (MS-DOS 7/Windows95) additional file times (see #0701)
  50.  16h    WORD    time of creation or last update (see #1005 at AX=5700h)
  51.  18h    WORD    date of creation or last update (see #1006 at AX=5700h)
  52.  1Ah    WORD    starting cluster number (see also AX=440Dh/CX=0871h)
  53.  1Ch    DWORD    file size
  54. SeeAlso: #0702,#1956,#1957
  55.  
  56. Format of MS-DOS 7/Windows95 additional file times:
  57. Offset    Size    Description    (Table 0701)
  58.  00h    BYTE    reserved
  59.  01h    BYTE    10-millisecond units past creation time below
  60.  02h    WORD    file creation time
  61.  04h    WORD    file creation date
  62.  06h    WORD    last-access date
  63.  08h    WORD    reserved??? (0000h)
  64. Note:    this data is stored beginning at offset 0Ch in a standard directory
  65.       entry
  66. SeeAlso: #0700
  67.  
  68. Format of MS-DOS 7/Windows95 long-filename directory entry:
  69. Offset    Size    Description    (Table 0702)
  70.  00h    BYTE    LFN record sequence (bit 6 set if last record for file)
  71.  01h 10 BYTEs    long filename, first part
  72.  0Bh    BYTE    0Fh (otherwise impossible file attribute, used as signature)
  73.  0Ch    BYTE    reserved??? (00h)
  74.  0Dh    BYTE    checksum for short filename
  75.  10h 12 BYTEs    long filename, second part
  76.  1Ah    WORD    first cluster number (always 0000h for LFN records)
  77.  1Ch  4 BYTEs    long filename, third part
  78. Notes:    long-filename entries are always stored in the directory just prior
  79.       to the short-name entry for a file
  80.     multiple LFN records are used if the long filename does not fit into
  81.       a single record
  82.     the short-filename checksum byte is computed by adding up the
  83.       eleven bytes of the short filename, rotating the intermediate
  84.       sum right one bit before adding the next character
  85.     the long filename is encoded as 16-bit Unicode characters; for most
  86.       filenames, this appears in the directory as the ASCII character
  87.       followed by 00h
  88. SeeAlso: #0700
  89. --------D-2112-------------------------------
  90. INT 21 - DOS 1+ - FIND NEXT MATCHING FILE USING FCB
  91.     AH = 12h
  92.     DS:DX -> unopened FCB (see #0693)
  93. Return: AL = status
  94.         00h successful
  95.         Disk Transfer Area filled with unopened FCB
  96.         FFh no more matching filenames
  97. Note:    (see AH=11h)
  98.     assumes that successful FindFirst executed on search FCB before call
  99. SeeAlso: AH=1Ah,AH=4Fh,INT 2F/AX=111Ch
  100. --------D-2113-------------------------------
  101. INT 21 - DOS 1+ - DELETE FILE USING FCB
  102.     AH = 13h
  103.     DS:DX -> unopened FCB (see #0693), filename filled with template for
  104.         deletion ('?' wildcards allowed)
  105. Return: AL = status
  106.         00h one or more files successfully deleted
  107.         FFh no matching files or all were read-only or locked
  108. Notes:    DOS 1.25+ deletes everything in the current directory (including
  109.       subdirectories) and sets the first byte of the name to 00h (entry
  110.       never used) instead of E5h if called on an extended FCB with
  111.       filename '???????????' and bits 0-4 of the attribute set (bits 1 and
  112.       2 for DOS 1.x).  This may have originally been an optimization to
  113.       minimize directory searching after a mass deletion (DOS 1.25+ stop
  114.       the directory search upon encountering a never-used entry), but can
  115.       corrupt the filesystem under DOS 2+ because subdirectories are
  116.       removed without deleting the files they contain.
  117.     currently-open files should not be deleted
  118.     MS-DOS allows deletion of read-only files with an extended FCB, whereas
  119.       Novell NetWare, DR DOS 6, and Novell DOS 7 do not
  120. SeeAlso: AH=41h,INT 2F/AX=1113h
  121. --------D-2114-------------------------------
  122. INT 21 - DOS 1+ - SEQUENTIAL READ FROM FCB FILE
  123.     AH = 14h
  124.     DS:DX -> opened FCB (see #0693)
  125. Return: AL = status
  126.         00h successful
  127.         01h end of file (no data)
  128.         02h segment wrap in DTA
  129.         03h end of file, partial record read
  130.     Disk Tranfer Area filled with record read from file
  131. Notes:    reads a record of the size specified in the FCB beginning at the
  132.       current file position, then updates the current block and current
  133.       record fields in the FCB
  134.     if a partial record was read, it is zero-padded to the full size
  135.     not supported by MS Windows 3.0 DOSX.EXE DOS extender
  136. SeeAlso: AH=0Fh,AH=15h,AH=1Ah,AH=3Fh"DOS",INT 2F/AX=1108h
  137. --------D-2115-------------------------------
  138. INT 21 - DOS 1+ - SEQUENTIAL WRITE TO FCB FILE
  139.     AH = 15h
  140.     DS:DX -> opened FCB (see #0693)
  141.     Disk Tranfer Area contains record to be written
  142. Return: AL = status
  143.         00h successful
  144.         01h disk full
  145.         02h segment wrap in DTA
  146. Notes:    writes a record of the size specified in the FCB beginning at the
  147.       current file position, then updates the current block and current
  148.       record fields in the FCB
  149.     if less than a full sector is written, the data is placed in a DOS
  150.       buffer to be written out at a later time
  151.     not supported by MS Windows 3.0 DOSX.EXE DOS extender
  152. SeeAlso: AH=0Fh,AH=14h,AH=1Ah,AH=40h,INT 2F/AX=1109h
  153. --------D-2116-------------------------------
  154. INT 21 - DOS 1+ - CREATE OR TRUNCATE FILE USING FCB
  155.     AH = 16h
  156.     DS:DX -> unopened FCB (see #0693), wildcards not allowed
  157. Return: AL = status
  158.         00h successful
  159.         FFh directory full or file exists and is read-only or locked
  160. Notes:    if file already exists, it is truncated to zero length
  161.     if an extended FCB is used, the file is given the attribute in the
  162.       FCB; this is how to create a volume label in the disk's root dir
  163.     not supported by MS Windows 3.0 DOSX.EXE DOS extender
  164.     (FAT32 drive) this function will only succeed for creating a volume
  165.       label; FAT32 does not support FCBs for file I/O
  166. SeeAlso: AH=0Fh,AH=10h,AH=3Ch
  167. --------D-2117-------------------------------
  168. INT 21 - DOS 1+ - RENAME FILE USING FCB
  169.     AH = 17h
  170.     DS:DX -> modified FCB (see also #0693)
  171.         the old filename ('?' wildcards OK) is in the standard location
  172.         while the new filename ('?' wildcards OK, no drive) is stored
  173.         in the 11 bytes beginning at offset 11h
  174. Return: AL = status
  175.         00h successfully renamed
  176.         FFh no matching files,file is read-only, or new name already exists
  177. Notes:    subdirectories may be renamed using an extended FCB with the
  178.       appropriate attribute, as may volume labels
  179.     DR DOS checks password attached with AX=4303h before permitting rename
  180. SeeAlso: AH=0Fh,AH=13h,AX=4303h,AH=56h,INT 2F/AX=1111h
  181. --------D-2118-------------------------------
  182. INT 21 - DOS 1+ - NULL FUNCTION FOR CP/M COMPATIBILITY
  183.     AH = 18h
  184. Return: AL = 00h
  185. Note:    corresponds to the CP/M BDOS function "get bit map of logged drives",
  186.       which is meaningless under MS-DOS
  187. SeeAlso: AH=1Dh,AH=1Eh,AH=20h,AX=4459h,INT 60/DI=0513h
  188. --------v-211812------------------------
  189. INT 21 - VIRUS - "Tasha Yar" - INSTALLATION CHECK
  190.     AX = 1812h
  191. Return: AL = 00h if resident
  192.     DX = 4310h if resident
  193. SeeAlso: INT 21/AX=0B56h"VIRUS",INT 21/AX=187Fh,INT 21/AX=2C2Ch"VIRUS"
  194. --------v-21187F-----------------------------
  195. INT 21 - VIRUS - "DS-3783" -INSTALLATION CHECK
  196.     AX = 187Fh
  197.     BX = 4453h
  198. Return: BX = 87A1h if resident
  199. SeeAlso: AX=1812h"VIRUS",AX=18FFh"VIRUS"
  200. --------v-2118FF-----------------------------
  201. INT 21 - VIRUS - "Pathogen:SMEG" - INSTALLATION CHECK
  202.     AX = 18FFh
  203. Return: AX = E701h if resident
  204. SeeAlso: INT 21/AX=1812h"VIRUS",INT 21/AX=2080h"VIRUS"
  205. --------D-2119-------------------------------
  206. INT 21 - DOS 1+ - GET CURRENT DEFAULT DRIVE
  207.     AH = 19h
  208. Return: AL = drive (00h = A:, 01h = B:, etc)
  209. Note:    Novell NetWare uses the fact that DOS 2.x COMMAND.COM issues this call
  210.       from a particular location every time it starts a command to
  211.       determine when to issue an automatic EOJ
  212. SeeAlso: AH=0Eh,AH=47h,AH=BBh
  213. --------D-211A-------------------------------
  214. INT 21 - DOS 1+ - SET DISK TRANSFER AREA ADDRESS
  215.     AH = 1Ah
  216.     DS:DX -> Disk Transfer Area (DTA)
  217. Notes:    the DTA is set to PSP:0080h when a program is started
  218.     under the FlashTek X-32 DOS extender, the pointer is in DS:EDX
  219. SeeAlso: AH=11h,AH=12h,AH=2Fh,AH=4Eh,AH=4Fh
  220. --------D-211B-------------------------------
  221. INT 21 - DOS 1+ - GET ALLOCATION INFORMATION FOR DEFAULT DRIVE
  222.     AH = 1Bh
  223. Return: AL = sectors per cluster (allocation unit)
  224.     CX = bytes per sector
  225.     DX = total number of clusters
  226.     DS:BX -> media ID byte (see #0703)
  227. Notes:    under DOS 1.x, DS:BX points at an actual copy of the FAT; later
  228.       versions return a pointer to a copy of the FAT's ID byte
  229.     this function may not be properly supported on CD-ROMs and other
  230.       installable file systems (use AX=4402h"CD-ROM" for CD-ROMs
  231.       instead)
  232. SeeAlso: AH=1Ch,AH=36h
  233.  
  234. (Table 0703)
  235. Values for media ID byte:
  236.  FFh    floppy, double-sided, 8 sectors per track (320K)
  237.  FEh    floppy, single-sided, 8 sectors per track (160K)
  238.  FDh    floppy, double-sided, 9 sectors per track (360K)
  239.  FCh    floppy, single-sided, 9 sectors per track (180K)
  240.  FAh    HP 200LX D: ROM disk, 16 sectors per track (995K)
  241.     HP 200LX E: (Stacker host drive ???)
  242.  F9h    floppy, double-sided, 15 sectors per track (1.2M)
  243.     floppy, double-sided, 9 sectors per track (720K,3.5")
  244.  F8h    hard disk
  245.  F0h    other media
  246.     (e.g. floppy, double-sized, 18 sectors per track -- 1.44M,3.5")
  247. --------D-211C-------------------------------
  248. INT 21 - DOS 1+ - GET ALLOCATION INFORMATION FOR SPECIFIC DRIVE
  249.     AH = 1Ch
  250.     DL = drive (00h = default, 01h = A:, etc)
  251. Return: AL = sectors per cluster (allocation unit), or FFh if invalid drive
  252.     CX = bytes per sector
  253.     DX = total number of clusters
  254.     DS:BX -> media ID byte (see #0703)
  255. Notes:    under DOS 1.x, DS:BX points at an actual copy of the FAT; later
  256.       versions return a pointer to a copy of the FAT's ID byte
  257.     on a DBLSPACE drive, the total number of clusters is based on the
  258.       estimated compression ratio
  259.     this function may not be properly supported on CD-ROMs and other
  260.       installable file systems (use AX=4402h"CD-ROM" for CD-ROMs
  261.       instead)
  262. SeeAlso: AH=1Bh,AH=36h
  263. --------D-211D-------------------------------
  264. INT 21 - DOS 1+ - NULL FUNCTION FOR CP/M COMPATIBILITY
  265.     AH = 1Dh
  266. Return: AL = 00h
  267. Note:    corresponds to the CP/M BDOS function "get bit map of read-only
  268.       drives", which is meaningless under MS-DOS
  269. SeeAlso: AH=18h,AH=1Eh,AH=20h,AX=4459h
  270. --------D-211E-------------------------------
  271. INT 21 - DOS 1+ - NULL FUNCTION FOR CP/M COMPATIBILITY
  272.     AH = 1Eh
  273. Return: AL = 00h
  274. Note:    corresponds to the CP/M BDOS function "set file attributes" which was
  275.      meaningless under MS-DOS 1.x
  276. SeeAlso: AH=18h,AH=1Dh,AH=20h
  277. --------D-211F-------------------------------
  278. INT 21 - DOS 1+ - GET DRIVE PARAMETER BLOCK FOR DEFAULT DRIVE
  279.     AH = 1Fh
  280. Return: AL = status
  281.         00h successful
  282.         DS:BX -> Drive Parameter Block (DPB) (see #0704 for DOS 1.x,
  283.             AH=32h for DOS 2+)
  284.         FFh invalid drive
  285. Note:    this call was undocumented prior to the release of DOS 5.0; however,
  286.       only the DOS 4.0+ version of the DPB has been documented
  287. SeeAlso: AH=32h,AX=7302h
  288.  
  289. Format of DOS 1.1 and MS-DOS 1.25 drive parameter block:
  290. Offset    Size    Description    (Table 0704)
  291.  00h    BYTE    sequential device ID
  292.  01h    BYTE    logical drive number (0=A:)
  293.  02h    WORD    bytes per sector
  294.  04h    BYTE    highest sector number within a cluster
  295.  05h    BYTE    shift count to convert clusters into sectors
  296.  06h    WORD    starting sector number of first FAT
  297.  08h    BYTE    number of copies of FAT
  298.  09h    WORD    number of directory entries
  299.  0Bh    WORD    number of first data sector
  300.  0Dh    WORD    highest cluster number (number of data clusters + 1)
  301.  0Fh    BYTE    sectors per FAT
  302.  10h    WORD    starting sector of directory
  303.  12h    WORD    address of allocation table
  304. Note:    the DOS 1.0 table is the same except that the first and last fields
  305.       are missing; see INT 21/AH=32h for the DOS 2+ version
  306. --------D-2120-------------------------------
  307. INT 21 - DOS 1+ - NULL FUNCTION FOR CP/M COMPATIBILITY
  308.     AH = 20h
  309. Return: AL = 00h
  310. Note:    corresponds to the CP/M BDOS function "get/set default user
  311.       (sublibrary) number", which is meaningless under MS-DOS
  312. SeeAlso: AH=18h,AH=1Dh,AH=1Eh,AX=4459h
  313. --------v-212080-----------------------------
  314. INT 21 - VIRUS - "New-Year" - INSTALLATION CHECK
  315.     AX = 2080h
  316. Return: AH = 00h if resident (normal DOS return would be AX = 2000h)
  317. SeeAlso: INT 21/AX=18FFh"VIRUS",INT 21/AX=2C2Ch"VIRUS"
  318. --------D-2121-------------------------------
  319. INT 21 - DOS 1+ - READ RANDOM RECORD FROM FCB FILE
  320.     AH = 21h
  321.     DS:DX -> opened FCB (see #0693)
  322. Return: AL = status
  323.         00h successful
  324.         01h end of file, no data read
  325.         02h segment wrap in DTA, no data read
  326.         03h end of file, partial record read
  327.     Disk Tranfer Area filled with record read from file
  328. Notes:    the record is read from the current file position as specified by the
  329.       random record and record size fields of the FCB
  330.     the file position is not updated after reading the record
  331.     if a partial record is read, it is zero-padded to the full size
  332.     not supported by MS Windows 3.0 DOSX.EXE DOS extender
  333. SeeAlso: AH=14h,AH=22h,AH=27h,AH=3Fh"DOS"
  334. --------D-2122-------------------------------
  335. INT 21 - DOS 1+ - WRITE RANDOM RECORD TO FCB FILE
  336.     AH = 22h
  337.     DS:DX -> opened FCB (see #0693)
  338.     Disk Transfer Area contains record to be written
  339. Return: AL = status
  340.         00h successful
  341.         01h disk full
  342.         02h segment wrap in DTA
  343. Notes:    the record is written to the current file position as specified by the
  344.       random record and record size fields of the FCB
  345.     the file position is not updated after writing the record
  346.     if the record is located beyond the end of the file, the file is
  347.       extended but the intervening data remains uninitialized
  348.     if the record only partially fills a disk sector, it is copied to a
  349.       DOS disk buffer to be written out to disk at a later time
  350.     not supported by MS Windows 3.0 DOSX.EXE DOS extender
  351. SeeAlso: AH=15h,AH=21h,AH=28h,AH=40h
  352. --------D-2123-------------------------------
  353. INT 21 - DOS 1+ - GET FILE SIZE FOR FCB
  354.     AH = 23h
  355.     DS:DX -> unopened FCB (see #0693), wildcards not allowed
  356. Return: AL = status
  357.         00h successful (matching file found)
  358.         FCB random record field filled with size in records, rounded up
  359.         to next full record
  360.         FFh failed (no matching file found)
  361. Notes:    not supported by MS Windows 3.0 DOSX.EXE DOS extender
  362.     MS-DOS returns nonsense if the FCB record number field is set to a very
  363.       large positive number, and status FFh if negative; DR DOS returns the
  364.       correct file size in both cases
  365. BUG:    APPEND for DOS 3.3+ corrupts DX if the file is not found
  366. SeeAlso: AH=42h
  367. --------D-2124-------------------------------
  368. INT 21 - DOS 1+ - SET RANDOM RECORD NUMBER FOR FCB
  369.     AH = 24h
  370.     DS:DX -> opened FCB (see #0693)
  371. Notes:    computes the random record number corresponding to the current record
  372.       number and record size, then stores the result in the FCB
  373.     normally used when switching from sequential to random access
  374.     not supported by MS Windows 3.0 DOSX.EXE DOS extender
  375. SeeAlso: AH=21h,AH=27h,AH=42h
  376. --------D-2125-------------------------------
  377. INT 21 - DOS 1+ - SET INTERRUPT VECTOR
  378.     AH = 25h
  379.     AL = interrupt number
  380.     DS:DX -> new interrupt handler
  381. Notes:    this function is preferred over direct modification of the interrupt
  382.       vector table
  383.     some DOS extenders place an API on this function, as it is not
  384.       directly meaningful in protected mode
  385.     under DR DOS 5.0+, this function does not use any of the DOS-internal
  386.       stacks and may thus be called at any time
  387.     Novell NetWare (except the new DOS Requester) monitors the offset of
  388.       any INT 24 set, and if equal to the value at startup, substitutes
  389.       its own handler to allow handling of network errors; this introduces
  390.       the potential bug that any program whose INT 24 handler offset
  391.       happens to be the same as COMMAND.COM's will not have its INT 24
  392.       handler installed
  393. SeeAlso: AX=2501h,AH=35h
  394. --------E-212501-----------------------------
  395. INT 21 P - Phar Lap 386/DOS-Extender - RESET DOS EXTENDER DATA STRUCTURES
  396.     AX = 2501h
  397.     SS = application's original SS or DS (FlashTek X-32VM)
  398. Return: CF clear if successful
  399.     CF set on error
  400.         caller is operating on X-32 stack (FlashTek X-32VM)
  401. Notes:    Phar Lap uses INT 21/AH=25h as the entry point for all 386/DOS-Extender
  402.       system calls.     Only available when directly using 386/DOS-Extender or
  403.       a compatible DOS extender, or when using a product that was created
  404.       using 386-DOS/Extender or a compatible
  405.     this function is also supported by FlashTek X-32VM
  406. SeeAlso: AH=30h"Phar Lap"
  407. --------E-212502-----------------------------
  408. INT 21 P - Phar Lap 386/DOS-Extender - GET PROTECTED-MODE INTERRUPT VECTOR
  409.     AX = 2502h
  410.     CL = interrupt number
  411. Return: CF clear
  412.     ES:EBX = CS:EIP of protected-mode interrupt handler
  413. Note:    this function is also supported by FlashTek X-32VM
  414. SeeAlso: AX=2503h,AX=2504h,INT 31/AX=0204h
  415. --------E-212503-----------------------------
  416. INT 21 P - Phar Lap 386/DOS-Extender - GET REAL-MODE INTERRUPT VECTOR
  417.     AX = 2503h
  418.     CL = interrupt number
  419. Return: CF clear
  420.     EBX = CS:IP of real-mode interrupt handler
  421. Note:    this function is also supported by FlashTek X-32VM
  422. SeeAlso: AX=2502h,AX=2504h,AH=35h,INT 31/AX=0200h
  423. --------E-212504-----------------------------
  424. INT 21 P - Phar Lap 386/DOS-Extender - SET PROTECTED-MODE INTERRUPT VECTOR
  425.     AX = 2504h
  426.     CL = interrupt number
  427.     DS:EDX = CS:EIP of protected-mode interrupt handler
  428. Return: CF clear
  429. Note:    this function is also supported by FlashTek X-32VM
  430. SeeAlso: AX=2502h,AX=2505h,INT 31/AX=0205h
  431. --------E-212505-----------------------------
  432. INT 21 P - Phar Lap 386/DOS-Extender - SET REAL-MODE INTERRUPT VECTOR
  433.     AX = 2505h
  434.     CL = interrupt number
  435.     EBX = CS:IP of real-mode interrupt handler
  436. Return: CF clear
  437. Note:    this function is also supported by FlashTek X-32VM
  438. SeeAlso: AX=2503h,AX=2504h,INT 31/AX=0201h
  439. --------E-212506-----------------------------
  440. INT 21 P - Phar Lap 386/DOS-Extender - SET INT TO ALWAYS GAIN CNTRL IN PR. MODE
  441.     AX = 2506h
  442.     CL = interrupt number
  443.     DS:EDX = CS:EIP of protected-mode interrupt handler
  444. Return: CF clear
  445. Notes:    this function modifies both the real-mode low-memory interrupt
  446.       vector table and the protected-mode Interrupt Descriptor Table (IDT)
  447.     interrupts occurring in real mode are resignaled in protected mode
  448.     this function is also supported by FlashTek X-32VM
  449. --------E-212507-----------------------------
  450. INT 21 P - Phar Lap 386/DOS-Extender - SET REAL- & PROTECTED-MODE INT VECTORS
  451.     AX = 2507h
  452.     CL = interrupt number
  453.     DS:EDX = CS:EIP of protected-mode interrupt handler
  454.     EBX = CS:IP of real-mode interrupt handler
  455. Return: CF clear
  456. Notes:    interrupts are disabled until both vectors have been modified
  457.     this function is also supported by FlashTek X-32VM
  458. SeeAlso: AX=2504h,AX=2505h
  459. --------E-212508-----------------------------
  460. INT 21 P - Phar Lap 386/DOS-Extender - GET SEGMENT LINEAR BASE ADDRESS
  461.     AX = 2508h
  462.     BX = segment selector
  463. Return: CF clear if successful
  464.         ECX = linear base address of segment
  465.     CF set if invalid segment selector
  466. Note:    this function is also supported by FlashTek X-32VM
  467. SeeAlso: AX=2509h
  468. --------E-212509-----------------------------
  469. INT 21 P - Phar Lap 386/DOS-Extender - CONVERT LINEAR TO PHYSICAL ADDRESS
  470.     AX = 2509h
  471.     EBX = linear address to convert
  472. Return: CF clear if successful
  473.         ECX = physical address (carry flag clear)
  474.     CF set if linear address not mapped in page tables
  475. SeeAlso: AX=2508h
  476. --------E-212509-----------------------------
  477. INT 21 P - FlashTek X-32VM - GET SYSTEM SEGMENTS AND SELECTORS
  478.     AX = 2509h
  479. Return: CF clear
  480.     EAX high word = default DS
  481.     AX = alias for 16-bit data segment
  482.     BX = real mode code segment
  483.     EDX high word = selector covering full 4GB address space
  484.     DX = default SS
  485.     ESI high word = PSP selector
  486.     SI = environment selector
  487. --------E-21250A-----------------------------
  488. INT 21 P - Phar Lap 386/DOS-Extender - MAP PHYSICAL MEMORY AT END OF SEGMENT
  489.     AX = 250Ah
  490.     ES = segment selector in the Local Descriptor Table (LDT) of segment
  491.          to modify
  492.     EBX = physical base address of memory to map (multiple of 4K)
  493.     ECX = number of physical 4K pages to map
  494. Return: CF clear if successful
  495.         EAX = 32-bit offset in segment of mapped memory
  496.     CF set on error
  497.         EAX = error code
  498.         08h insufficient memory to create page tables
  499.         09h invalid segment selector
  500. SeeAlso: INT 31/AX=0800h
  501. --------E-21250C-----------------------------
  502. INT 21 P - Phar Lap 386/DOS-Extender - GET HARDWARE INTERRUPT VECTORS
  503.     AX = 250Ch
  504. Return: CF clear
  505.     AL = base interrupt vector for IRQ0-IRQ7
  506.     AH = base interrupt vector for IRQ8-IRQ15
  507.     BL = interrupt vector for BIOS print screen function (Phar Lap only)
  508. Note:    this function is also supported by FlashTek X-32VM
  509. SeeAlso: INT 31/AX=0400h,INT 67/AX=DE0Ah
  510. --------E-21250D-----------------------------
  511. INT 21 P - Phar Lap 386/DOS-Extender - GET REAL-MODE LINK INFORMATION
  512.     AX = 250Dh
  513. Return: CF clear
  514.     EAX = CS:IP of real-mode callback procedure (see #0705) that will
  515.           call through from real mode to a protected-mode routine
  516.     EBX = 32-bit real-mode address of intermode call data buffer
  517.     ECX = size in bytes of intermode call data buffer
  518.     ES:EDX = protected-mode address of intermode call data buffer
  519. Notes:    this function is also supported by FlashTek X-32VM
  520.     X-32VM guarantees the intermode buffer to be at least 4 KB
  521. SeeAlso: AX=250Eh
  522.  
  523. (Table 0705)
  524. Call Phar Lap real-mode callback with:
  525.     STACK:    DWORD    offset to protected-mode code
  526.         WORD    placeholder for protected-mode CS
  527.         DWORD    pointer to selector structure (see #0706)
  528.             or 0000h:0000h for defaults
  529.         var    parameters for protected-mode procedure
  530. Return: via FAR return
  531.  
  532. Format of Phar Lap selector structure:
  533. Offset    Size    Description    (Table 0706)
  534.  00h    WORD    protected-mode GS selector
  535.  02h    WORD    protected-mode FS selector
  536.  04h    WORD    protected-mode ES selector
  537.  06h    WORD    protected-mode DS selector
  538. --------E-21250E-----------------------------
  539. INT 21 P - Phar Lap 386/DOS-Extender - CALL REAL-MODE PROCEDURE
  540.     AX = 250Eh
  541.     EBX = CS:IP of real-mode procedure to call
  542.     ECX = number of two-byte words to copy from protected-mode stack
  543.           to real-mode stack
  544. Return: CF clear if successful
  545.         all segment registers unchanged
  546.         all general registers contain values set by real-mode procedure
  547.         all other flags set as they were left by real-mode procedure
  548.         stack unchanged
  549.     CF set on error
  550.         EAX = error code
  551.         01h not enough real-mode stack space
  552. Note:    this function is also supported by FlashTek X-32VM; under X-32VM, the
  553.       call will fail if ECX > 0000003Fh
  554. SeeAlso: AX=250Dh,AX=2510h,AH=E1h"OS/286",INT 31/AX=0301h
  555. --------E-21250F-----------------------------
  556. INT 21 P - Phar Lap 386/DOS-Extender - CONVERT PROTECTED-MODE ADDRESS TO MS-DOS
  557.     AX = 250Fh
  558.     ES:EBX = 48-bit protected-mode address to convert
  559.     ECX = 00000000h or length of data in bytes
  560. Return: CF clear if successful (address < 1MB and contiguous)
  561.         ECX = 32-bit real-mode MS-DOS address
  562.     CF set on error (address >= 1MB or not contiguous)
  563.         ECX = linear address
  564. Note:    this function is also supported by FlashTek X-32VM
  565. SeeAlso: AX=2510h
  566. --------E-212510-----------------------------
  567. INT 21 P - Phar Lap 386/DOS-Extender - CALL REAL-MODE PROCEDURE, REGISTERS
  568.     AX = 2510h
  569.     EBX = CS:IP of real-mode procedure to call
  570.     ECX = number of two-byte words to copy to protected-mode stack to
  571.           real-mode stack
  572.     DS:EDX -> pointer to parameter block (see #0707)
  573. Return: CF clear if successful
  574.         all segment registers unchanged,
  575.         EDX unchanged
  576.         all other general registers contain values set by real-mode proc
  577.         all other flags are set as they were left by real-mode procedure
  578.         real-mode register values are returned in the parameter block
  579.     CF set on error
  580.         EAX = error code
  581.         01h not enough real-mode stack space
  582. Note:    unlike most of the preceding 25xxh functions, this one is not
  583.       supported by FlashTek X-32VM
  584. SeeAlso: AX=250Eh,AX=250Fh
  585.  
  586. Format of Phar Lap real-mode call parameter block:
  587. Offset    Size    Description    (Table 0707)
  588.  00h    WORD    real-mode DS value
  589.  02h    WORD    real-mode ES value
  590.  04h    WORD    real-mode FS value
  591.  06h    WORD    real-mode GS value
  592.  08h    DWORD    real-mode EAX value
  593.  0Ch    DWORD    real-mode EBX value
  594.  10h    DWORD    real-mode ECX value
  595.  14h    DWORD    real-mode EDX value
  596. --------E-212511-----------------------------
  597. INT 21 P - Phar Lap 386/DOS-Extender - ISSUE REAL-MODE INTERRUPT
  598.     AX = 2511h
  599.     DS:EDX -> parameter block (see #0708)
  600. Return: all segment registers unchanged
  601.     EDX unchanged
  602.     all other registers contain values set by the real-mode int handler
  603.     the flags are set as they were left by the real-mode interrupt handler
  604.     real-mode register values are returned in the parameter block
  605. Note:    this function is also supported by FlashTek X-32VM
  606. SeeAlso: AX=2503h,AX=2505h,AX=250Eh,AH=E3h"OS/286",INT 31/AX=0300h
  607.  
  608. Format of Phar Lap real-mode interrupt parameter block:
  609. Offset    Size    Description    (Table 0708)
  610.  00h    WORD    interrupt number
  611.  02h    WORD    real-mode DS value
  612.  04h    WORD    real-mode ES value
  613.  06h    WORD    real-mode FS value
  614.  08h    WORD    real-mode GS value
  615.  0Ah    DWORD    real-mode EAX value
  616.  0Eh    DWORD    real-mode EDX value
  617. Note: all other real-mode values set from protected-mode registers
  618. --------E-212512-----------------------------
  619. INT 21 P - Phar Lap 386/DOS-Extender - LOAD PROGRAM FOR DEBUGGING
  620.     AX = 2512h
  621.     DS:EDX -> pointer to ASCIZ program name
  622.     ES:EBX -> pointer to parameter block (see #0710)
  623.     ECX = size in bytes of LDT buffer
  624. Return: CF clear if successful
  625.         EAX = number of segment descriptors in LDT
  626.     CF set on error
  627.         EAX = error code (see #0709)
  628. SeeAlso: AX=2517h
  629.  
  630. (Table 0709)
  631. Values for Phar Lap error code:
  632.  02h    file not found or path invalid
  633.  05h    access denied
  634.  08h    insufficient memory
  635.  0Ah    environment invalid
  636.  0Bh    invalid file format
  637.  80h    LDT too small
  638.  
  639. Format of Phar Lap program load parameter block:
  640. Offset    Size    Description    (Table 0710)
  641. Input:
  642.  00h    DWORD    32-bit offset of environment string
  643.  04h    WORD    segment of environment string
  644.  06h    DWORD    32-bit offset of command-tail string
  645.  0Ah    WORD    segment of command-tail string
  646.  0Ch    DWORD    32-bit offset of LDT buffer (size in ECX)
  647.  10h    WORD    segment of LDT buffer
  648. Output:
  649.  12h    WORD    real-mode paragraph address of PSP (see also AH=26h)
  650.  14h    WORD    real/protected mode flag
  651.         0000h  real mode
  652.         0001h  protected mode
  653.  16h    DWORD    initial EIP value
  654.  1Ah    WORD    initial CS value
  655.  1Ch    DWORD    initial ESP value
  656.  20h    WORD    initial SS value
  657.  22h    WORD    initial DS value
  658.  24h    WORD    initial ES value
  659.  26h    WORD    initial FS value
  660.  28h    WORD    initial GS value
  661. --------E-212513-----------------------------
  662. INT 21 P - Phar Lap 386/DOS-Extender - ALIAS SEGMENT DESCRIPTOR
  663.     AX = 2513h
  664.     BX = segment selector of descriptor in GDT or LDT
  665.     CL = access-rights byte for alias descriptor
  666.     CH = use-type bit (USE16 or USE32) for alias descriptor
  667. Return: CF clear if successful
  668.         AX = segment selector for created alias
  669.     CF set on error
  670.         EAX = error code
  671.         08h insufficient memory (can't grow LDT)
  672.         09h invalid segment selector in BX
  673. --------E-212514-----------------------------
  674. INT 21 P - Phar Lap 386/DOS-Extender - CHANGE SEGMENT ATTRIBUTES
  675.     AX = 2514h
  676.     BX = segment selector of descriptor in GDT or LDT
  677.     CL = new access-rights byte
  678.     CH = new use-type bit (USE16 or USE32)
  679. Return: CF clear if successful
  680.     CF set on error
  681.         EAX = error code
  682.         09h invalid selector in BX
  683. SeeAlso: AX=2515h,INT 31/AX=0009h
  684. --------E-212515-----------------------------
  685. INT 21 P - Phar Lap 386/DOS-Extender - GET SEGMENT ATTRIBUTES
  686.     AX = 2515h
  687.     BX = segment selector of descriptor in GDT or LDT
  688. Return: CF clear if successful
  689.         CL = access-rights byte for segment
  690.         CH = use-type bit (USE16 or USE32)
  691.     ECX<16-31> destroyed
  692.     CF set on error
  693.         EAX = error code
  694.         09h invalid segment selector in BX
  695. SeeAlso: AX=2514h
  696. --------E-212516-----------------------------
  697. INT 21 P - Phar Lap 386/DOS-Extender v2.2+ - FREE ALL MEMORY OWNED BY LDT
  698.     AX = 2516h
  699. Return: CF clear
  700. Note:    this function must be called from Ring 0 or the CS descriptor is freed
  701. --------E-212517-----------------------------
  702. INT 21 P - Phar Lap 386/DOS-Extender v2.1c+ - GET INFO ON DOS DATA BUFFER
  703.     AX = 2517h
  704. Return: CF clear
  705.     ES:EBX -> data buffer (protected mode address)
  706.     ECX -> data buffer (real mode address)
  707.     EDX = size of data buffer in bytes
  708. Note:    the data buffer's address changes after calls to AX=2512h and AX=252Ah
  709. SeeAlso: AX=2512h,AX=252Ah,AX=2530h
  710. --------E-212518-----------------------------
  711. INT 21 P - Phar Lap 386/DOS-Extender 2.1c+ - SPECIFY HANDLER FOR MOVED SEGMENTS
  712.     AX = 2518h
  713.     ES:EBX -> function to call when a segment is moved
  714. Return: CF clear
  715.     ES:EBX -> previous handler
  716. --------E-212519-----------------------------
  717. INT 21 P - Phar Lap 386/DOS-Extender VMM - GET ADDITIONAL MEMORY ERROR INFO
  718.     AX = 2519h
  719. Return: CF clear
  720.     EAX = error code
  721.         0000h  no error
  722.         0001h  out of physical memory
  723.         0002h  out of swap space (unable to grow swap file)
  724.         0003h  out of LDT entries and unable to grow LDT
  725.         0004h  unable to change extended memory allocation mark
  726.         FFFFFFFFh    paging disabled
  727. Note:    VMM is the Virtual Memory Manager option
  728. --------E-21251A-----------------------------
  729. INT 21 P - Phar Lap 386/DOS-Extender VMM - LOCK PAGES IN MEMORY
  730.     AX = 251Ah
  731.     EDX = number of 4k pages to lock
  732.     if BL = 00h
  733.         ECX = linear address of first page to lock
  734.     if BL = 01h
  735.         ES:ECX -> pointer to first page to lock
  736. Return: CF clear if successful
  737.     CF set on error
  738.         EAX = error code
  739.         08h insufficient memory
  740.         09h invalid address range
  741. SeeAlso: AX=251Bh,AX=EB06h,INT 31/AX=0600h
  742. --------E-21251B-----------------------------
  743. INT 21 P - Phar Lap 386/DOS-Extender VMM - UNLOCK PAGES
  744.     AX = 251Bh
  745.     EDX = number of pages to unlock
  746.     if BL = 00h
  747.         ECX = linear address of first page to unlock
  748.     if BL = 01h
  749.         ES:ECX -> pointer to first page to unlock
  750. Return: CF clear if successful
  751.     CF set on error
  752.         EAX = error code
  753.         09h invalid address range
  754. SeeAlso: AX=251Ah,AX=EB07h,INT 31/AX=0601h
  755. --------E-21251C-----------------------------
  756. INT 21 P - Phar Lap 386/DOS-Extender VMM v2.1c+ - FREE PHYSICAL MEMORY PAGES
  757.     AX = 251Ch
  758.     BH = preservation flag (00h preserve contents, 01h discard contents)
  759.     EDX = number of pages to free
  760.     BL = address type
  761.         00h linear address
  762.         ECX = linear address of first page to be freed
  763.         01h pointer
  764.         ES:ECX -> first page to be freed
  765. Return: CF clear if successful
  766.     CF set on error
  767.         EAX = error code
  768.         08h memory error, swap space full, no VMM or DPMI
  769.         09h invalid address
  770. --------E-21251D-----------------------------
  771. INT 21 OP - Phar Lap 386/DOS-Extender VMM v2.1c - READ PAGE-TABLE ENTRY
  772.     AX = 251Dh
  773.     BL = address type
  774.         00h linear address
  775.         ECX = linear address of page table entry to read
  776.         01h pointer
  777.         ES:ECX -> page table entry to read
  778. Return: CF clear if successful
  779.         EAX = contents of page table entry
  780.     CF set on error
  781.         EAX = error code
  782.         09h invalid address or NOPAGE option set
  783.         78h invalid under DPMI
  784. Note:    this function is obsolete; use AX=252Bh/BH=09h instead
  785. SeeAlso: AX=251Eh,AX=252Bh/BH=09h,AX=EB00h,INT 31/AX=0506h
  786. --------E-21251E-----------------------------
  787. INT 21 OP - Phar Lap 386/DOS-Extender VMM v2.1c - WRITE PAGE-TABLE ENTRY
  788.     AX = 251Eh
  789.     BL = address type
  790.         00h linear address
  791.         ECX = linear address of page table entry to read
  792.         01h pointer
  793.         ES:ECX -> page table entry to read
  794.     EDX = new value for page table entry
  795. Return: CF clear if successful
  796.     CF set on error
  797.         EAX = error code
  798.         09h invalid address or NOPAGE option set
  799.         82h not compatible with DPMI
  800. Note:    this call is obsolete; use AX=252Bh/BH=0Ah instead
  801. SeeAlso: AX=251Dh,AX=252Bh/BH=0Ah,INT 31/AX=0507h
  802. --------E-21251F-----------------------------
  803. INT 21 P - Phar Lap 386/DOS-Extender VMM - EXHANGE TWO PAGE-TABLE ENTRIES
  804.     AX = 251Fh
  805.     BL = address type
  806.         00h linear address
  807.         ECX = linear address of first page table entry
  808.         EDX = linear address of second page table entry
  809.         01h pointer
  810.         ES:ECX -> first page table entry
  811.         ES:EDX -> second page table entry
  812. Return: CF clear if successful
  813.     CF set on error
  814.         EAX = error code
  815.         09h invalid address or NOPAGE option set
  816.         82h not compatible with DPMI
  817. SeeAlso: AX=251Dh,AX=251Eh
  818. --------E-212520-----------------------------
  819. INT 21 P - Phar Lap 386/DOS-Extender VMM - GET MEMORY STATISTICS
  820.     AX = 2520h
  821.     DS:EDX -> pointer to buffer at least 100 bytes in size (see #0711)
  822.     BL = 0 (don't reset VM stats), 1 (reset VM stats)
  823. Return: carry flag clear
  824.  
  825. Format of Phar Lap VM statistics buffer:
  826. Offset    Size    Description    (Table 0711)
  827.  00h    DWORD    VM status
  828.         0001h VM subsystem is present
  829.         0000h VM not present
  830.  04h    DWORD    "nconvpg" number of conventional memory pages available
  831.  08h    DWORD    "nbimpg" number of Compaq built-in memory pages available
  832.  0Ch    DWORD    "nextpg" total number of extended memory pages
  833.  10h    DWORD    "extlim" extender memory pages limit
  834.  14h    DWORD    "aphyspg" number of physical memory pages allocated to appl
  835.  18h    DWORD    "alockpg" number of locked pages owned by application
  836.  1Ch    DWORD    "sysphyspg" number physical memory pages allocated to system
  837.  20h    DWORD    "nfreepg" number of free physical pages; approx if EMS VCPI
  838.  24h    DWORD    linear address of beginning of application address space
  839.  28h    DWORD    linear address of end of application address space
  840.  2Ch    DWORD    number of seconds since last time VM stats were reset
  841.  30h    DWORD    number of page faults since last time
  842.  34h    DWORD    number of pages written to swap file since last time
  843.  38h    DWORD    number of reclaimed pages (page faults on swapped pages)
  844.  3Ch    DWORD    number of virtual pages allocated to the application
  845.  40h    DWORD    size in pages of swap file
  846.  44h    DWORD    number of system pages allocated with EMS calls
  847.  48h    DWORD    minimum number of conventional memory pages
  848.  4Ch    DWORD    maximum size in pages to which swap file can be increased
  849.  50h    DWORD    "vmflags"
  850.         bit 0 = 1 if page fault in progress
  851. ---v4.0+ ---
  852.  54h    DWORD    number of physical pages guaranteed to be free
  853.  58h    DWORD    number of free physical pages currently available
  854.  5Ch    DWORD    size in pages of largest free block of memory (including disk
  855.           swap space)
  856.  60h    DWORD    reserved
  857. --------E-212521-----------------------------
  858. INT 21 P - Phar Lap 386/DOS-Extender VMM - LIMIT PROGRAM'S EXTENDED MEM USAGE
  859.     AX = 2521h
  860.     EBX = max 4k pages of physical extended memory which program may use
  861. Return: CF clear if successful
  862.        EBX = maximum limit in pages
  863.        ECX = minimum limit in pages
  864.     CF set on error
  865.         EAX = error code
  866.         08h insufficient memory or -nopage switch used
  867. SeeAlso: AX=2522h
  868. --------E-212522-----------------------------
  869. INT 21 P - Phar Lap 386/DOS-Ext VMM v2.2+ - SPECIFY ALTERNATE PAGE-FAULT HANDLR
  870.     AX = 2522h
  871.     ES:EBX -> alternate handler for page faults
  872. Return: CF clear
  873.     ES:EBX -> previous page-fault handler
  874. SeeAlso: AX=2523h
  875. --------E-212523-----------------------------
  876. INT 21 P - Phar Lap 386/DOS-Ext VMM v2.2+ - SPECIFY OUT-OF-SWAP-SPACE HANDLER
  877.     AX = 2523h
  878.     ???
  879. Return: ???
  880. Note:    this function takes a DWORD pointer and a DWORD pointer to a DWORD
  881.       pointer as arguments
  882. SeeAlso: AX=2522h
  883. --------E-212524-----------------------------
  884. INT 21 P - Phar Lap 386/DOS-Ext VMM v2.2+ - INSTALL PAGE-REPLACEMENT HANDLERS
  885.     AX = 2524h
  886.     ???
  887. Return: ???
  888. Note:    this function takes three DWORD pointers and three DWORD pointers to
  889.       DWORD pointers as arguments
  890. --------E-212525-----------------------------
  891. INT 21 P - Phar Lap 386/DOS-Extender VMM - LIMIT PROGRAM'S CONVENT'L MEM USAGE
  892.     AX = 2525h
  893.     EBX = limit in 4k pages of physical conventional memory which program
  894.           may use
  895. Return: CF clear if successful
  896.         EBX = maximum limit in pages
  897.         ECX = minimum limit in pages
  898.     CF set on error
  899.         EAX = error code
  900.         08h insufficient memory or -nopage switch used
  901. SeeAlso: AX=2521h
  902. --------E-212526-----------------------------
  903. INT 21 P - Phar Lap 386/DOS-Extender - GET CONFIGURATION INFORMATION
  904.     AX = 2526h
  905.     ???
  906. Return: ???
  907. Notes:    details are not yet available
  908.     this function takes a pointer to the configuration buffer (see #0712)
  909.       and a poitner to a BYTE as arguments
  910.  
  911. Format of Phar Lap configuration buffer:
  912. Offset    Size    Description    (Table 0712)
  913.  00h    DWORD    flags 1 (see #0713)
  914.  04h    DWORD    flags 2 (unused through v5.0)
  915.  08h    DWORD    flags 3 (unused through v5.0)
  916.  0Ch    DWORD    386|DOS-Extender major version
  917.  10h    DWORD    386|DOS-Extender minor version
  918.  14h    DWORD    first letter of text after minor version number in version str
  919.  18h    DWORD    beta flag (00h normal release, 01h beta release)
  920.  1Ch    DWORD    processor (3 = 386, 4 = 486)
  921.  20h    DWORD    coprocessor (4 = none, 6 = 287, 7 = 387/486)
  922.  24h    DWORD    Weitek coprocessor flag (0 = none, 1 = present)
  923.  28h    DWORD    machine type (0 = IBM PC compatible, 1 = NEC 9800 series)
  924.  2Ch    DWORD    machine class
  925.         IBM: bus type (0=ISA, 1=MCA, 2=XT, 3=EISA)
  926.         NEC: 0=normal mode, 1=high-res mode
  927.  30h    DWORD    VCPI flag (0 = none, 1 = present)
  928.  34h    DWORD    -WEITEK/-1167 switch (0 = AUTO, 1 = ON, 2 = OFF)
  929.  38h    DWORD    -MINREAL setting
  930.  3Ch    DWORD    -MAXREAL setting
  931.  40h    DWORD    -MINIBUF setting
  932.  44h    DWORD    -MAXIBUF setting
  933.  48h    DWORD    size in bytes of DOS call data buffer
  934.  4Ch    DWORD    number of interrupt stacks (-NISTACK)
  935.  50h    DWORD    interrupt stack size (-ISTKSIZE)
  936.  54h    DWORD    -REALBREAK setting
  937.  58h    DWORD    -CALLBUFS
  938.  5Ch    DWORD    -HWIVEC
  939.  60h    DWORD    -PRIVEC
  940.  64h    DWORD    -INTMAP
  941.  68h    DWORD    -PRIMAP
  942.  6Ch    DWORD    VCPI: master 8259 interrupt vector base (IRQ0 mapping)
  943.  70h    DWORD    VCPI: slave 8259 interrupt vector base (IRQ8 mapping)
  944.  74h    DWORD    BIOS print screen interrupt vector (0 if NEC)
  945.  78h    DWORD    -EXTLOW setting
  946.  7Ch    DWORD    -EXTHIGH setting
  947.  80h    DWORD    lowest physical extended-memory address allocatable
  948.  84h    DWORD    highest physical extended-memory address allocatable + 1
  949.  88h    DWORD    special memory's physical base address (00000000h if none)
  950.  8Ch    DWORD    special memory size in bytes (00000000h if none)
  951.  90h    DWORD    -MAXVCPIMEM setting
  952.  94h    DWORD    -VSCAN
  953.  98h    DWORD    -SWAPCHK (0 = OFF, 1 = ON, 2 = FORCE, 3 = MAX)
  954.  9Ch    DWORD    -CODESIZE setting
  955.  A0h    DWORD    minimum swap file size (-MINSWFSIZE)
  956.  A4h    DWORD    maximum swap fiel size (-MAXSWFSIZE)
  957.  A8h    DWORD    page replacement policy (0 = LFU, 1 = NUR)
  958.  ACh    DWORD    number of GDT entries (-NGDTENT)
  959.  B0h    DWORD    number of LDT entries (-NLDTENT)
  960.  B4h    DWORD    program's privilege level (0-3)
  961. ---386|DOS-Extender v3.0+ ---
  962.  B8h    DWORD    -LOCKSTACK setting
  963.  BCh    DWORD    -MAXEXTMEM
  964.  C0h    DWORD    -MAXXMSMEM
  965.  C4h    DWORD    -MAXPGMMEM
  966.  C8h    DWORD    -DATATHRESHOLD
  967.  CCh    DWORD    virtual memory manager flag (0 = not present, 1 = present)
  968.  D0h    DWORD    Cyrix coprocessor flag (0 = no Cyrix EMC387, 1 = present)
  969.  D4h    DWORD    -CYRIX setting (0 = AUTO, 1 = ON, 2 = OFF)
  970.  D8h    DWORD    DPMI flag (0 = not present, 1 = present)
  971.  DCh    DWORD    DPMI major version
  972.  E0h    DWORD    DPMI minor version
  973.  E4h    DWORD    DPMI capabilities flags (see #0714)
  974.  E8h    DWORD    VCPI major version
  975.  ECh    DWORD    VCPI minor version
  976.  F0h    WORD    VCPI: IRQ0-7 physical base interrupt vector
  977.  F2h    WORD    VCPI: IRQ8-15 physical base interrupt vector
  978.  F4h    DWORD    XMS flag (0 = none, 1 = present)
  979.  F8h    DWORD    XMS major version
  980.  FCh    DWORD    XMS minor version
  981. 100h    WORD    application's CS selector
  982. 102h    WORD    application's DS selector
  983. 104h    WORD    application's PSP selector
  984. 106h    WORD    application's environment selector
  985. 108h    WORD    selector mapping entire first megabyte
  986. 10Ah    WORD    selector mapping text video memory
  987. 10Ch    WORD    selector mapping video memory (text for IBM, graphics for NEC)
  988. 10Eh    WORD    selector mapping Weitek address space, 0000h if not present
  989. 110h    WORD    selector mapping Cyrix EMC387 address space, 0000h if none
  990. 112h    WORD    reserved (0)
  991. 114h    DWORD    real-mode FAR entry point to call to switch to protected mode
  992.           with no saved context
  993. 118h    DWORD    size of LDT in bytes
  994. ---386|DOS-Extender v5.0+ ---
  995. 11Ch    DWORD    Windows flag (0 = not present, 1 = Windows present)
  996. 120h    DWORD    Windows major version
  997. 124h    DWORD    Windows minor version
  998. 128h    DWORD    Windows mode (0 = real/standard, 1 = enhanced)
  999. 12Ch    DWORD    OS/2 flag (0 = not present, 1 = OS/2 present)
  1000. 130h    DWORD    OS/2 major version
  1001. 134h    DWORD    OS/2 minor version
  1002. 138h 50 DWORDs    reserved (0)
  1003.  
  1004. Bitfields for flags 1:
  1005. Bit(s)    Description    (Table 0713)
  1006.  0    -NOPAGE specified
  1007.  1    -A20 specified
  1008.  2    -VDISK specified
  1009.  3    -XT specified
  1010.  4    -AT specified
  1011.  5    -MCA specified
  1012.  6    -EISA specified
  1013.  7    -NORMRES specified (NEC only)
  1014.  8    -HIGHRES specified (NEC only)
  1015.  9    set if -SWFGROW1ST, clear if -NOSWFGROW1ST
  1016.  10    -NOVM specified
  1017.  11    -SAVEREGS specified
  1018.  12    unused (clear)
  1019.  13    -NOVCPI specified
  1020.  14    -NOMUL specified
  1021.  15    -NOBMCHK specified
  1022.  16    -NOSPCLMEM or -NOBIM
  1023.  17    -NOPGEXP specified
  1024.  18    -SWAPDEFDISK specified
  1025. ---v3.0+ ---
  1026.  19    -SAVEINTS specified
  1027.  20    -NOLOAD specified
  1028.  21    -PAGELOG specified
  1029.  22    -OPENDENY specified
  1030.  23    -ERRATA17 specified
  1031. ---v4.1+ ---
  1032.  24    -NESTDPMI specified
  1033.  25    -NONESTDPMI specified
  1034.  26    -NODPMI specified
  1035.  27    -NOPCDWEITEK specified
  1036. ---v4.2+ ---
  1037.  28    -WININT21 specified
  1038.  
  1039. Bitfields for DPMI capabilities flags:
  1040. Bit(s)    Description    (Table 0714)
  1041.  0    paging supported
  1042.  1    physical device mapping
  1043.  2    conventional memory mapping
  1044.  3    exceptions restartable
  1045. --------E-212527-----------------------------
  1046. INT 21 P - Phar Lap 386/DOS-Extender VMM - EN/DISABLE STATE SAVE ON INTERRUPTS
  1047.     AX = 2527h
  1048.     EBX = new status (00h disabled, 01h enabled)
  1049. Return: CF clear
  1050.     EBX = previous state save flag
  1051. SeeAlso: AX=2528h
  1052. --------E-212528-----------------------------
  1053. INT 21 P - Phar Lap 386/DOS-Extender VMM - READ REGISTERS AFTER CTRL-C INT
  1054.     AX = 2528h
  1055.     DS:EBX -> buffer for registers (see #0715)
  1056. Return: CF clear if successful
  1057.         DS:EBX buffer filled
  1058.     CF set on error
  1059.         EAX = error code
  1060.         83h interrupt state save not enabled
  1061.         84h no active interrupt
  1062. SeeAlso: AX=2527h
  1063.  
  1064. Format of Phar Lap buffer for registers:
  1065. Offset    Size    Description    (Table 0715)
  1066.  00h  8 BYTEs    unused
  1067.  08h  4    DWORDs    EAX,EBX,ECX,EDX
  1068.  18h  4 DWORDs    ESI,EDI,EBP,ESP
  1069.  28h  6 WORDs    CS,DS,SS,ES,FS,GS
  1070.  34h    DWORD    EIP
  1071.  38h    DWORD    EFLAGS
  1072. --------E-212529-----------------------------
  1073. INT 21 P - Phar Lap 386/DOS-Extender - LOAD FLAT MODEL .EXP or .REX FILE
  1074.     AX = 2529h
  1075.     ???
  1076. Return: ES:EBX -> parameter block (see #0716)
  1077.     ???
  1078. Note:    details not available at this time
  1079. SeeAlso: AX=252Ah
  1080.  
  1081. Format of Phar Lap program load parameter block:
  1082. Offset    Size    Description    (Table 0716)
  1083.  00h    DWORD    initial EIP
  1084.  04h    WORD    initial CS
  1085.  06h    DWORD    initial ESP
  1086.  0Ah    WORD    initial SS
  1087.  0Ch  4 WORDs    initial DS, ES, FS, GS
  1088.  14h    DWORD    minimum size in bytes of program segment
  1089.  18h    DWORD    bytes of additional memory allocated
  1090.  1Ch    DWORD    flags
  1091.         bit 0: child linked with -UNPRIVILEGED
  1092.         ---v6.0+ ---
  1093.         bit 1: child is PE file instead of .EXP
  1094.         bit 2: loaded file is a DLL
  1095.         bits 3-31 reserved
  1096. ---v6.0+ ---
  1097.  20h    DWORD    module handles (PE files only)
  1098.  24h  7 DWORDs    reserved (0)
  1099. --------E-21252A-----------------------------
  1100. INT 21 P - Phar Lap 386/DOS-Extender VMM - NEW LOAD PROGRAM FOR DEBUG
  1101.     AX = 252Ah
  1102.     DS:EDX -> ASCIZ program name
  1103.     ES:EBX -> parameter block (see #0710)
  1104.     ECX = size of LDT buffer in bytes
  1105.     ESI = bit flags
  1106.         bit 0: allow demand paging rather than loading entire program
  1107.         bit 1: demand page from swap file rather than from .EXP
  1108. Return: CF clear if successful
  1109.         EAX = VMM handle or FFFFFFFFh if none
  1110.         ECX = number of descriptors in LDT buffer
  1111.     CF set on error
  1112.         EAX = error code
  1113.         02h file error
  1114.             EBX = file error code (see #0717)
  1115.             ECX = DOS error code if EBX=1,2,3, or 8
  1116.         08h insufficient memory
  1117.             EBX = memory error code (see #0718)
  1118.         80h LDT buffer too small
  1119.         87h called twice without intervening call to AX=2531h
  1120. SeeAlso: AX=2512h,AX=2517h,AX=2529h,AX=2531h
  1121.  
  1122. (Table 0717)
  1123. Values for Phar Lap file error code:
  1124.  01h    DOS open error
  1125.  02h    DOS seek error
  1126.  03h    DOS read error
  1127.  04h    not an .EXP or .REX file
  1128.  05h    invalid file format
  1129.  06h    -OFFSET is not a multiple of 64K
  1130.  07h    -NOPAGE incompatible with -REALBREAK/-OFFSET
  1131.  08h    DOS error loading .EXE file
  1132.  
  1133. (Table 0718)
  1134. Values for Phar Lap memory error code:
  1135.  01h    out of physical memory
  1136.  02h    out of swap space
  1137.  04h    unable to change extended memory allocation
  1138.  05h    -MAXPGMMEM exceeded
  1139.  06h    insufficient low memory to REALBREAK value
  1140.  07h    insufficient low memory for PSP and environment
  1141. --------E-21252BBH00-------------------------
  1142. INT 21 Pu - Phar Lap 386/DOS-Extender - CREATE UNMAPPED PAGES
  1143.     AX = 252Bh
  1144.     BH = 00h
  1145.     ???
  1146. Return: ???
  1147. --------E-21252BBH01-------------------------
  1148. INT 21 Pu - Phar Lap 386/DOS-Extender - CREATE ALLOCATED PAGES
  1149.     AX = 252Bh
  1150.     BH = 01h
  1151.     ???
  1152. Return: ???
  1153. --------E-21252BBH02-------------------------
  1154. INT 21 Pu - Phar Lap 386/DOS-Extender - CREATE PHYSICAL DEVICE PAGES
  1155.     AX = 252Bh
  1156.     BH = 02h
  1157.     ???
  1158. Return: ???
  1159. --------E-21252BBH03-------------------------
  1160. INT 21 Pu - Phar Lap 386/DOS-Extender - MAP DATA FILE
  1161.     AX = 252Bh
  1162.     BH = 03h
  1163.     ???
  1164. Return: ???
  1165. SeeAlso: AX=252Bh/BH=0Bh
  1166. --------E-21252BBH04-------------------------
  1167. INT 21 Pu - Phar Lap 386/DOS-Extender - GET PAGE TYPES
  1168.     AX = 252Bh
  1169.     BH = 04h
  1170.     ???
  1171. Return: ???
  1172. Note:    returns one word per page
  1173. SeeAlso: #0719
  1174.  
  1175. Bitfields for Phar Lap page information:
  1176. Bit(s)    Description    (Table 0719)
  1177.  7    mapped to read/write data file
  1178.  6    mapped to read-only data file
  1179.  5    swapped to disk
  1180.  4    locked
  1181.  3-0    page type
  1182.     0 unmapped
  1183.     1 allocated
  1184.     2 physical device page
  1185. --------E-21252B-----------------------------
  1186. INT 21 P - Phar Lap 386/DOS-Extender - VIRTUAL MEMORY MANAGEMENT - PAGE LOCKING
  1187.     AX = 252Bh
  1188.     BH = function
  1189.         05h lock pages
  1190.         06h unlock pages
  1191.     BL = address type
  1192.         00h linear address
  1193.         ECX = linear start address of memory region
  1194.         01h segmented address
  1195.         ES:ECX -> start of memory region
  1196.     EDX = size of memory region in bytes
  1197. Return: CF clear if successful
  1198.     CF set on error
  1199. Note:    this function is also supported by FlashTek X-32VM; if X-32 is not
  1200.       using virtual memory, this function always succeeds
  1201. --------E-21252B-----------------------------
  1202. INT 21 Pu - Phar Lap 386/DOS-Extender - FREE PHYSICAL PAGES
  1203.     AX = 252Bh
  1204.     BH = function (07h,08h)
  1205.     ???
  1206. Return: ???
  1207. --------E-21252BBH09-------------------------
  1208. INT 21 P - Phar Lap 386/DOS-Extender v4.1 - GET PAGETABLE ENTRY/PAGE TABLE INFO
  1209.     AX = 252Bh
  1210.     BH = 09h
  1211.     BL = subfunction
  1212.         00h get page table entry by linear address
  1213.         ECX = linear address for which to get page table entry
  1214.         01h get page table entry by logical address
  1215.         ES:ECX = address for which to get page table entry
  1216. Return: CF clear if successful
  1217.         EAX = page table entry
  1218.         EBX = additional page table information
  1219.     CF set on error
  1220.         EAX = error code
  1221.         0009h invalid address
  1222.         0082h running under DPMI
  1223. SeeAlso: AX=251Dh,AX=252Bh/BH=0Ah
  1224. --------E-21252BBH0A-------------------------
  1225. INT 21 P - Phar Lap 386/DOS-Extender v4.1 - SET PAGETABLE ENTRY/PAGE TABLE INFO
  1226.     AX = 252Bh
  1227.     BH = 0Ah
  1228.     BL = subfunction
  1229.         00h set page table entry for linear address
  1230.         ECX = linear address for which to get page table entry
  1231.         01h set page table entry for logical address
  1232.         ES:ECX = address for which to get page table entry
  1233.     ESI = page table entry
  1234.     EDI = additional page table information
  1235. Return: CF clear if successful
  1236.     CF set on error
  1237.         EAX = error code
  1238.         0009h invalid address
  1239.         0082h running under DPMI
  1240. SeeAlso: AX=252Bh/BH=09h
  1241. --------E-21252BBH0B-------------------------
  1242. INT 21 P - Phar Lap 386/DOS-Extender v4.1+ - MAP DATA FILE AT FILE OFFSET
  1243.     AX = 252Bh
  1244.     BH = 0Bh
  1245.     BL = subfunction
  1246.         00h by linear address
  1247.         ECX = linear address at which to map data file
  1248.         01h by logical address
  1249.         ES:ECX = logical address at which to map data file
  1250.     EDX = number of bytes to map
  1251.     DS:ESI -> mapping structure (see #0720)
  1252.     DS:EDI -> ASCIZ filename
  1253. Return: CF clear if successful
  1254.     CF set on error
  1255.         EAX = error code
  1256.         0002h file error
  1257.             ECX = phase (01h opening file, 02h seeking, 03h reading)
  1258.             EDX = error code returned by DOS
  1259.         0009h invalid address
  1260.         0081h invalid parameters or 386|VMM not present
  1261.         0086h all 386|VMM file handles already in use
  1262. SeeAlso: AX=252Bh/BH=03h,AX=252Bh/BH=09h
  1263.  
  1264. Format of Phar Lap mapping structure:
  1265. Offset    Size    Description    (Table 0720)
  1266.  00h    DWORD    starting file offset to be mapped
  1267.  04h    DWORD    DOS file access and sharing modes (see #0750 at INT 21/AH=3Dh)
  1268. --------E-21252C-----------------------------
  1269. INT 21 P - Phar Lap 386/DOS-Ext VMM v3.0 - ADD UNMAPPED PAGES AT END OF SEGMENT
  1270.     AX = 252Ch
  1271.     BX = segment selector
  1272.     ECX = number of 4K pages to add
  1273. Return: CF clear if successful
  1274.         EAX = offset in segment of beginning of unmapped pages
  1275.     CF set on error
  1276.         EAX = error code
  1277.         08h insufficent memory
  1278.         09h invalid selector
  1279.         82h not supported by current DPMI
  1280. --------E-21252D-----------------------------
  1281. INT 21 P - Phar Lap 386/DOS-Extender VMM v2.3+ - CLOSE VMM FILE HANDLE
  1282.     AX = 252Dh
  1283.     EBX = VMM file handle
  1284. Return: CF clear if successful
  1285.     CF set on error
  1286.         EAX = error code (81h invalid VMM handle)
  1287. --------E-21252E-----------------------------
  1288. INT 21 P - Phar Lap 386/DOS-Extender VMM v2.3+ - GET/SET VMM PARAMETERS
  1289.     AX = 252Eh
  1290.     CL = direction (00h get parameters, 01h set parameters)
  1291.     DS:EBX -> parameter buffer (see #0721)
  1292. Return: CF clear if successful
  1293.     CF set on error
  1294.         EAX = error code (81h bad parameter value)
  1295.  
  1296. Format of Phar Lap VMM parameter buffer:
  1297. Offset    Size    Description    (Table 0721)
  1298.  00h    DWORD    flags
  1299.         bit 0: page fault logging enabled
  1300.         ---v5.0+ ---
  1301.         bit 1: swap extender to disk during DOS EXEC call
  1302.         bit 2: don't zero allocated memory
  1303.  04h    DWORD    scan period for page aging, in milliseconds
  1304.  08h    DWORD    maximum size (in bytes) to check on each page scan
  1305.  0Ch 52 BYTEs    unused
  1306. --------E-21252F-----------------------------
  1307. INT 21 P - Phar Lap 386/DOS-Ext VMM v3.0 - WRITE RECORD TO VMM PAGE LOG FILE
  1308.     AX = 252Fh
  1309.     DS:EBX -> data to be written
  1310.     CX = size of data in bytes
  1311. Return: CF clear if successful
  1312.     CF set on error
  1313.         EAX = error code (85h no page log file or not 386/VMM)
  1314. --------E-212530-----------------------------
  1315. INT 21 P - Phar Lap 386/DOS-Ext VMM v2.3+ - SET SIZE OF BUFFER FOR DOS CALLS
  1316.     AX = 2530h
  1317.     ECX = size of data buffer in bytes (1024 to 65536)
  1318. Return: CF clear if successful
  1319.     CF set on error
  1320.         EAX = error code
  1321.         08h insufficient low memory
  1322.         81h invalid size
  1323. SeeAlso: AX=2517h
  1324. --------E-212531-----------------------------
  1325. INT 21 P - Phar Lap 386/DOS-Extender VMM v3.0 - READ/WRITE LDT DESCRIPTOR
  1326.     AX = 2531h
  1327.     BX = segment selector
  1328.     ECX = direction (00h read, 01h write)
  1329.     DS:EDX -> 8-byte buffer for descriptor contents
  1330. Return: CF clear if successful
  1331.     CF set on error
  1332.         EAX = error code
  1333.         81h invalid selector
  1334.         82h DPMI running, or not a code or data segment
  1335. --------E-212532-----------------------------
  1336. INT 21 P - Phar Lap 386/DOS-Extender - GET EXCEPTION HANDLER VECTOR
  1337.     AX = 2532h
  1338.     CL = exception number (00h-0Fh)
  1339. Return: CF clear if successful
  1340.         ES:EBX = CS:EIP of current exception handler
  1341.     CF set on error (CL > 0Fh)
  1342. Notes:    this call is also supported by the FlashTek X-32VM extender
  1343.     this function is incompatible with 386|VMM; use AX=2522h instead
  1344. SeeAlso: AX=2522h,AX=2533h
  1345. --------E-212533-----------------------------
  1346. INT 21 P - Phar Lap 386/DOS-Extender - SET EXCEPTION HANDLER VECTOR
  1347.     AX = 2533h
  1348.     CL = exception number (00h-0Fh)
  1349.     DS:EDX = CS:EIP of new exception handler
  1350. Return: CF clear if successful
  1351.     CF set on error (CL > 0Fh)
  1352. Notes:    this call is also supported by the FlashTek X-32VM extender
  1353.     this function is incompatible with 386|VMM; use AX=2522h instead
  1354. SeeAlso: AX=2522h,AX=2532h
  1355. --------E-212534-----------------------------
  1356. INT 21 P - Phar Lap 386/DOS-Extender v3.0+ - GET INTERRUPT FLAG
  1357.     AX = 2534h
  1358. Return: CF clear
  1359.     EAX = interrupt state (00h disabled, 01h enabled)
  1360. --------E-212535-----------------------------
  1361. INT 21 P - Phar Lap 386/DOS-Extender v3.0+ - READ/WRITE SYSTEM REGISTERS
  1362.     AX = 2535h
  1363.     EBX = direction (00h read registers, 01h write)
  1364.     DS:EDX -> system register record (see #0722)
  1365. Return: CF clear
  1366. Note:    this call is only available under MS Windows if PHARLAP.386 VDD is
  1367.       installed
  1368.  
  1369. Format of Phar Lap system register record:
  1370. Offset    Size    Description    (Table 0722)
  1371.  00h    DWORD    CR0
  1372.  04h  4 DWORDs    DR0,DR1,DR2,DR3
  1373.  14h  2 DWORDs    reserved
  1374.  1Ch  2 DWORDs    DR6,DR7
  1375.  24h  3 DWORDs    reserved
  1376. --------E-212536----------------------------
  1377. INT 21 P - Phar Lap 386/DOS-Ext VMM v3.0+ - MIN/MAX EXTENDED/CONV MEMORY USAGE
  1378.     AX = 2536h
  1379.     EBX = bit flags
  1380.         bit 0: modifying conventional memory rather than extended memory
  1381.         bit 1: setting maximum memory usage rather than minimum
  1382.     ECX = new limit in 4K pages
  1383. Return: CF clear if successful
  1384.         EAX = new limit
  1385.     CF set on error
  1386.         EAX = error code (08h memory error or -NOPAGE set)
  1387.         EBX = maximum limit in pages
  1388.         ECX = minimum limit in pages
  1389. --------E-212537----------------------------
  1390. INT 21 P - Phar Lap 386/DOS-Ext VMM v3.0 - ALLOCATE DOS MEMORY ABOVE DOS BUFFER
  1391.     AX = 2537h
  1392.     BX = number of paragraphs to allocate
  1393. Return: CF clear if successful
  1394.         AX = real-mode segment of allocated block
  1395.     CF set on error
  1396.         AX = error code
  1397.         07h MS-DOS memory chain corrupted
  1398.         08h insufficient low memory
  1399.         BX = size in paragraphs of largest free block
  1400. SeeAlso: AH=48h
  1401. --------E-212538----------------------------
  1402. INT 21 P - Phar Lap 386/DOS-Ext VMM v3.0 - READ PROTMODE REGS AFTER SFTWARE INT
  1403.     AX = 2538h
  1404.     DS:EBX -> buffer for registers (see #0715)
  1405.     ECX = register record to retrieve
  1406.         00h first interrupt state
  1407.         01h next interrupt state
  1408.         EDX = handle for current interrupt state
  1409. Return: CF clear if successful
  1410.         DS:EBX buffer filled
  1411.         EDX = handle of current interrupt state
  1412.         ESI = number of interrupt which occurred
  1413.     CF set on error
  1414.         EAX = error code
  1415.         81h invalid handle in EDX
  1416.         83h register saving not enabled
  1417.         84h no more interrupt states
  1418. SeeAlso: AX=2527h,AX=2528h
  1419. --------E-212539----------------------------
  1420. INT 21 P - Phar Lap 386/DOS-Ext VMM v3.0 - GET OFFSET OF .EXP FILE HEADER
  1421.     AX = 2539h
  1422.     BX = MS-DOS file handle for open file
  1423. Return: CF clear if successful
  1424.         EAX = offset of .EXP header in file
  1425.     CF set on error
  1426.         EAX = error code (02h file error)
  1427.         EBX = file error code
  1428.         02h DOS error seeking
  1429.         03h DOS error reading
  1430.         04h invalid file type
  1431.         05h invalid file format
  1432.         ECX = DOS error code if EBX=02h or 03h
  1433.     current file position in file modified
  1434. --------E-21253A----------------------------
  1435. INT 21 P - Phar Lap 386/DOS-Extender v3.0+ - INSTALL MOD. SEG FAILURE HANDLER
  1436.     AX = 253Ah
  1437.     ES:EBX -> function to be called when INT 21/AH=4Ah is about to return
  1438.         an error
  1439. Return: CF clear
  1440.     ES:EBX -> previous handler
  1441. SeeAlso: AH=4Ah
  1442. --------E-21253B----------------------------
  1443. INT 21 P - Phar Lap 386/DOS-Extender v3.0+ - JUMP TO REAL MODE CODE, NO CONTEXT
  1444.     AX = 253Bh
  1445.     DS:EBX -> buffer containing register contents (see #0715)
  1446. Return: never returns
  1447. SeeAlso: AX=2528h
  1448. --------E-21253C-----------------------------
  1449. INT 21 P - Phar Lap 386/DOS-Extender VMM v3.0+ - SHRINK 386|VMM SWAP FILE
  1450.     AX = 253Ch
  1451. Return: CF clear
  1452.     EAX = old size of swap file in bytes
  1453.     EBX = new size of swap file in bytes
  1454. --------E-21253D-----------------------------
  1455. INT 21 P - Phar Lap 386/DOS-Extender v4.0+ - READ/WRITE IDT DESCRIPTOR
  1456.     AX = 253Dh
  1457.     BL = interrupt number
  1458.     ECX = direction (0 = read, 1 = write)
  1459.     DS:EDX -> 8-byte buffer for descriptor
  1460. Return: CF clear if successful
  1461.         DS:EDX filled if reading
  1462.     CF set on error
  1463.         EAX = error code (0082h if running under DPMI)
  1464. Desc:    access hardware-level IDT rather than the internal 386/DOS-Extender
  1465.       shadow IDT
  1466. Notes:    this call will always fail under DPMI because it is not possible to
  1467.       access the IDT
  1468.     the descriptor is not checked when writing
  1469.     this call can normally be used only by programs running in ring 0
  1470.       because the processor does not allow an interrupt to be vectored to
  1471.       a less privileged ring
  1472. --------E-21253F-----------------------------
  1473. INT 21 Pu - Phar Lap 386/DOS-Extender v6.0+ - ALLOCATE LDT DESCRIPTOR
  1474.     AX = 253Fh
  1475.     BX = LDT descriptor to allocate (0000h for any)
  1476.     ???
  1477. Return: ???
  1478. --------E-212540-----------------------------
  1479. INT 21 Pu - Phar Lap 386/DOS-Extender v6.0+ - FORCE ALIAS OF SEGMENT
  1480.     AX = 2540h
  1481.     ???
  1482. Return: ???
  1483. --------E-212544-----------------------------
  1484. INT 21 Pu - Phar Lap 386/DOS-Extender v6.0+ - FREE DLL
  1485.     AX = 2544h
  1486.     ???
  1487. Return: ???
  1488. --------E-212545-----------------------------
  1489. INT 21 Pu - Phar Lap 386/DOS-Extender v6.0+ - GET/SET PROCEDURE ADDRESS
  1490.     AX = 2545h
  1491.     ECX = direction (00h get, 01h set)
  1492.     ???
  1493. Return: ???
  1494. --------E-212546-----------------------------
  1495. INT 21 Pu - Phar Lap 386/DOS-Extender v6.0+ - GET MODULE HANDLE
  1496.     AX = 2546h
  1497.     ???
  1498. Return: ???
  1499. --------E-2125C0-----------------------------
  1500. INT 21 P - Phar Lap 386/DOS-Extender - ALLOCATE MS-DOS MEMORY BLOCK
  1501.     AX = 25C0h
  1502.     BX = number of 16-byte paragraphs of MS-DOS memory requested
  1503. Return: CF clear if successful
  1504.         AX = real-mode paragraph address of memory
  1505.     CF set on error
  1506.         AX = error code
  1507.         07h MS-DOS memory control blocks destroyed
  1508.         08h insufficient memory
  1509.         BX = size in paragraphs of largest available memory block
  1510. SeeAlso: AX=25C1h,AX=25C2h
  1511. --------E-2125C1-----------------------------
  1512. INT 21 P - Phar Lap 386/DOS-Extender - RELEASE MS-DOS MEMORY BLOCK
  1513.     AX = 25C1h
  1514.     CX = real-mode paragraph address of memory block to free
  1515. Return: CF clear if successful
  1516.         EAX destroyed
  1517.     CF set on error
  1518.         AX = error code
  1519.         07h MS-DOS memory control blocks destroyed
  1520.         09h invalid memory block address in CX
  1521. SeeAlso: AX=25C0h,AX=25C2h
  1522. --------E-2125C2-----------------------------
  1523. INT 21 P - Phar Lap 386/DOS-Extender - MODIFY MS-DOS MEMORY BLOCK
  1524.     AX = 25C2h
  1525.     BX = new requested block size in paragraphs
  1526.     CX = real-mode paragraph address of memory block to modify
  1527. Return: CF clear if successful
  1528.         EAX destroyed
  1529.     CF set on error
  1530.         AX = error code
  1531.         07h MS-DOS memory control blocks destroyed
  1532.         08h insufficient memory
  1533.         09h invalid memory block address in CX
  1534.         BX = size in paragraphs of largest available memory block
  1535. SeeAlso: AX=25C0h,AX=25C1h
  1536. --------E-2125C3-----------------------------
  1537. INT 21 P - Phar Lap 386/DOS-Extender - EXECUTE PROGRAM
  1538.     AX = 25C3h
  1539.     ES:EBX -> pointer to parameter block (see #0724)
  1540.     DS:EDX -> pointer to ASCIZ program filename
  1541. Return: CF clear if successful
  1542.         all registers unchanged
  1543.     CF set on error
  1544.         EAX = error code (see #0723)
  1545.  
  1546. (Table 0723)
  1547. Values for Phar Lap error code:
  1548.  01h    function code in AL is invalid ???
  1549.  02h    file not found or path invalid
  1550.  05h    access denied
  1551.  08h    insufficient memory to load program
  1552.  0Ah    environment invalid
  1553.  0Bh    invalid file format
  1554.  
  1555. Format of parameter block:
  1556. Offset    Size    Description    (Table 0724)
  1557.  00h    DWORD    32-bit offset of environment string
  1558.  04h    WORD    segment selector of environment string
  1559.  06h    DWORD    32-bit offset of command-tail string
  1560.  0Ah    WORD    segment selector of command-tail string
  1561. --------D-2126-------------------------------
  1562. INT 21 - DOS 1+ - CREATE NEW PROGRAM SEGMENT PREFIX
  1563.     AH = 26h
  1564.     DX = segment at which to create PSP (see #0725)
  1565. Return: AL destroyed
  1566. Notes:    new PSP is updated with memory size information; INTs 22h, 23h, 24h
  1567.       taken from interrupt vector table; the parent PSP field is set to 0
  1568.     (DOS 2+) DOS assumes that the caller's CS is the segment of the PSP to
  1569.       copy
  1570. SeeAlso: AH=4Bh,AH=50h,AH=51h,AH=55h,AH=62h,AH=67h
  1571.  
  1572. Format of Program Segment Prefix (PSP):
  1573. Offset    Size    Description    (Table 0725)
  1574.  00h  2 BYTEs    INT 20 instruction for CP/M CALL 0 program termination
  1575.         the CDh 20h here is often used as a signature for a valid PSP
  1576.  02h    WORD    segment of first byte beyond memory allocated to program
  1577.  04h    BYTE    (DOS) unused filler
  1578.         (OS/2) count of fake DOS version returns
  1579.  05h    BYTE    CP/M CALL 5 service request (FAR CALL to absolute 000C0h)
  1580.         BUG: (DOS 2+ DEBUG) PSPs created by DEBUG point at 000BEh
  1581.  06h    WORD    CP/M compatibility--size of first segment for .COM files
  1582.  08h  2 BYTEs    remainder of FAR JMP at 05h
  1583.  0Ah    DWORD    stored INT 22 termination address
  1584.  0Eh    DWORD    stored INT 23 control-Break handler address
  1585.  12h    DWORD    DOS 1.1+ stored INT 24 critical error handler address
  1586.  16h    WORD    segment of parent PSP
  1587.  18h 20 BYTEs    DOS 2+ Job File Table, one byte per file handle, FFh = closed
  1588.  2Ch    WORD    DOS 2+ segment of environment for process (see #0726)
  1589.  2Eh    DWORD    DOS 2+ process's SS:SP on entry to last INT 21 call
  1590.  32h    WORD    DOS 3+ number of entries in JFT (default 20)
  1591.  34h    DWORD    DOS 3+ pointer to JFT (default PSP:0018h)
  1592.  38h    DWORD    DOS 3+ pointer to previous PSP (default FFFFFFFFh in 3.x)
  1593.         used by SHARE in DOS 3.3
  1594.  3Ch    BYTE    DOS 4+ (DBCS) interim console flag (see AX=6301h)
  1595.         Novell DOS 7 DBCS interim flag as set with AX=6301h
  1596.         (possibly also used by Far East MS-DOS 3.2-3.3)
  1597.  3Dh    BYTE    (APPEND) TrueName flag (see INT 2F/AX=B711h)
  1598.  3Eh    BYTE    (Novell NetWare) flag: next byte initialized if CEh
  1599.         (OS/2) capabilities flag
  1600.  3Fh    BYTE    (Novell NetWare) Novell task number if previous byte is CEh
  1601.  40h  2 BYTEs    DOS 5+ version to return on INT 21/AH=30h
  1602.  42h    WORD    (MSWindows3) selector of next PSP (PDB) in linked list
  1603.         Windows keeps a linked list of Windows programs only
  1604.  44h    WORD    (MSWindows3) "PDB_Partition"
  1605.  46h    WORD    (MSWindows3) "PDB_NextPDB"
  1606.  48h    BYTE    (MSWindows3) bit 0 set if non-Windows application (WINOLDAP)
  1607.  49h    BYTE    unused by DOS versions <= 6.00
  1608.  4Ch    WORD    (MSWindows3) "PDB_EntryStack"
  1609.  4Eh  2 BYTEs    unused by DOS versions <= 6.00
  1610.  50h  3 BYTEs    DOS 2+ service request (INT 21/RETF instructions)
  1611.  53h  2 BYTEs    unused in DOS versions <= 6.00
  1612.  55h  7 BYTEs    unused in DOS versions <= 6.00; can be used to make first FCB
  1613.           into an extended FCB
  1614.  5Ch 16 BYTEs    first default FCB, filled in from first commandline argument
  1615.         overwrites second FCB if opened
  1616.  6Ch 16 BYTEs    second default FCB, filled in from second commandline argument
  1617.           overwrites beginning of commandline if opened
  1618.  7Ch  4 BYTEs    unused
  1619.  80h 128 BYTEs    commandline / default DTA
  1620.         command tail is BYTE for length of tail, N BYTEs for the tail,
  1621.           followed by a BYTE containing 0Dh
  1622. Notes:    in DOS v3+, the limit on simultaneously open files may be increased by
  1623.       allocating memory for a new open file table, filling it with FFh,
  1624.       copying the first 20 bytes from the default table, and adjusting the
  1625.       pointer and count at 34h and 32h.  However, DOS will only copy the
  1626.       first 20 file handles into a child PSP (including the one created on
  1627.       EXEC).
  1628.     in an OS/2 DOS box, values of D0h-FEh in the open file table indicate
  1629.       device drivers
  1630.     network redirectors based on the original MS-Net implementation use
  1631.       values of 80h-FEh in the open file table to indicate remote files;
  1632.       Novell NetWare also uses values from FEh down to 80h or one more than
  1633.       FILES= (whichever is greater) to indicate remote files (except on
  1634.       OS/2, where is uses CFh down to 80h)
  1635.     MS-DOS 5.00 incorrectly fills the FCB fields when loading a program
  1636.       high; the first FCB is empty and the second contains the first
  1637.       parameter
  1638.     some DOS extenders place protected-mode values in various PSP fields
  1639.       such as the "parent" field, which can confuse PSP walkers.  Always
  1640.       check either for the CDh 20h signature or that the suspected PSP is
  1641.       at the beginning of a memory block which owns itself (the preceding
  1642.       paragraph should be a valid MCB with "owner" the same as the
  1643.       suspected PSP).
  1644.     Novell NetWare updates the fields at offsets 3Eh and 3Fh without
  1645.       checking that a legal PSP segment is current; see AH=50h for further
  1646.       discussion
  1647.     for 4DOS and Windows95, the command tail may be more than 126
  1648.       characters; in that case, the length byte will be set to 7Fh (with
  1649.       an 0Dh in the     127th position at offset FFh), and the first 126
  1650.       characters will be stored in the PSP, with the entire command line
  1651.       in the environment variable CMDLINE; under at least some versions
  1652.       of 4DOS, the byte at offset FFh is *not* set to 0Dh, so there is no
  1653.       terminating carriage return in the PSP's command tail.
  1654.  
  1655. Format of environment block:
  1656. Offset    Size    Description    (Table 0726)
  1657.  00h  N BYTEs    first environment variable, ASCIZ string of form "var=value"
  1658.       N BYTEs    second environment variable, ASCIZ string
  1659.     ...
  1660.       N BYTEs    last environment variable, ASCIZ string of form "var=value"
  1661.     BYTE    00h
  1662. ---DOS 3.0+ ---
  1663.     WORD    number of strings following environment (normally 1)
  1664.       N BYTEs    ASCIZ full pathname of program owning this environment
  1665.         other strings may follow
  1666. --------D-2127-------------------------------
  1667. INT 21 - DOS 1+ - RANDOM BLOCK READ FROM FCB FILE
  1668.     AH = 27h
  1669.     CX = number of records to read
  1670.     DS:DX -> opened FCB (see #0693)
  1671. Return: AL = status
  1672.         00h successful, all records read
  1673.         01h end of file, no data read
  1674.         02h segment wrap in DTA, no data read
  1675.         03h end of file, partial read
  1676.     Disk Transfer Area filled with records read from file
  1677.     CX = number of records read (return AL = 00h or 03h)
  1678. Notes:    read begins at current file position as specified in FCB; the file
  1679.       position is updated after reading
  1680.     not supported by MS Windows 3.0 DOSX.EXE DOS extender
  1681. SeeAlso: AH=21h,AH=28h,AH=3Fh"DOS"
  1682. --------D-2128-------------------------------
  1683. INT 21 - DOS 1+ - RANDOM BLOCK WRITE TO FCB FILE
  1684.     AH = 28h
  1685.     CX = number of records to write
  1686.     DS:DX -> opened FCB (see #0693)
  1687.     Disk Transfer Area contains records to be written
  1688. Return: AL = status
  1689.         00h successful
  1690.         01h disk full or file read-only
  1691.         02h segment wrap in DTA
  1692.     CX = number of records written
  1693. Notes:    write begins at current file position as specified in FCB; the file
  1694.       position is updated after writing
  1695.     if CX = 0000h on entry, no data is written; instead the file size is
  1696.       adjusted to be the same as the file position specified by the random
  1697.       record and record size fields of the FCB
  1698.     if the data to be written is less than a disk sector, it is copied into
  1699.       a DOS disk buffer, to be written out to disk at a later time
  1700.     not supported by MS Windows 3.0 DOSX.EXE DOS extender
  1701. SeeAlso: AH=22h,AH=27h,AH=40h,AH=59h/BX=0000h
  1702. --------D-2129-------------------------------
  1703. INT 21 - DOS 1+ - PARSE FILENAME INTO FCB
  1704.     AH = 29h
  1705.     AL = parsing options (see #0727)
  1706.     DS:SI -> filename string (both '*' and '?' wildcards OK)
  1707.     ES:DI -> buffer for unopened FCB
  1708. Return: AL = result code
  1709.         00h successful parse, no wildcards encountered
  1710.         01h successful parse, wildcards present
  1711.         FFh failed (invalid drive specifier)
  1712.     DS:SI -> first unparsed character
  1713.     ES:DI buffer filled with unopened FCB (see #0693)
  1714. Notes:    asterisks expanded to question marks in the FCB
  1715.     all processing stops when a filename terminator is encountered
  1716.     cannot be used with filespecs which include a path (DOS 2+)
  1717.     Novell NetWare monitors the result code since an 'invalid drive' may
  1718.       signal an attempt to reconnect a network drive; if there are no
  1719.       connections to the specified drive, NetWare attempts to build a
  1720.       connection and map the drive to the SYS:LOGIN directory
  1721. SeeAlso: AH=0Fh,AH=16h,AH=26h
  1722.  
  1723. Bitfields for parsing options:
  1724. Bit(s)    Description    (Table 0727)
  1725.  0    skip leading separators
  1726.  1    use existing drive number in FCB if no drive is specified, instead of
  1727.       setting field to zero
  1728.  2    use existing filename in FCB if no base name is specified, instead of
  1729.       filling field with blanks
  1730.  3    use existing extension in FCB if no extension is specified, instead of
  1731.       filling field with blanks
  1732.  4-7    reserved (0)
  1733. --------D-212A-------------------------------
  1734. INT 21 - DOS 1+ - GET SYSTEM DATE
  1735.     AH = 2Ah
  1736. Return: CX = year (1980-2099)
  1737.     DH = month
  1738.     DL = day
  1739. ---DOS 1.10+---
  1740.     AL = day of week (00h=Sunday)
  1741. SeeAlso: AH=2Bh"DOS",AH=2Ch,AH=E7h"Novell",INT 1A/AH=04h,INT 2F/AX=120Dh
  1742. --------D-212B-------------------------------
  1743. INT 21 - DOS 1+ - SET SYSTEM DATE
  1744.     AH = 2Bh
  1745.     CX = year (1980-2099)
  1746.     DH = month
  1747.     DL = day
  1748. Return: AL = status
  1749.         00h successful
  1750.         FFh invalid date, system date unchanged
  1751. Note:    DOS 3.3+ also sets CMOS clock
  1752. SeeAlso: AH=2Ah,AH=2Dh,INT 1A/AH=05h
  1753. --------E-212B--CX4149-----------------------
  1754. INT 21 - AI Architects - ??? - INSTALLATION CHECK
  1755.     AH = 2Bh
  1756.     CX = 4149h ('AI')
  1757.     DX = 413Fh ('A?')
  1758. Return: AL <> FFh if installed
  1759. Note:    Borland's TKERNEL makes this call
  1760. --------c-212B--CX4358-----------------------
  1761. INT 21 - Super PC-Kwik v3.20+ - INSTALLATION CHECK
  1762.     AH = 2Bh
  1763.     CX = 4358h ('CX')
  1764. Return: AL = FFh if PC-Kwik/PC-Cache not installed
  1765.     AL = 00h if installed
  1766.         CF clear
  1767.         CX = 6378h ('cx')
  1768.         BX = ???
  1769.         DX = version (DH = major version, DL = binary minor version)
  1770. Note:    PC Tools PC-Cache v5.x and Qualitas Qcache v4.00 are OEM versions of
  1771.       Super PC-Kwik, and thus support this call (PC-Cache 5.1 corresponds
  1772.       to PC-Kwik v3.20)
  1773. SeeAlso: INT 13/AH=A0h,INT 13/AH=B0h,INT 16/AX=FFA5h/CX=1111h
  1774. Index:    PC-Cache;installation check|Qualitas Qcache;installation check
  1775. Index:    installation check;PC-Cache 5.x|installation check;Qualitas Qcache
  1776. --------Q-212B--CX4445-----------------------
  1777. INT 21 - DESQview - INSTALLATION CHECK
  1778.     AH = 2Bh
  1779.     CX = 4445h ('DE')
  1780.     DX = 5351h ('SQ')
  1781.     AL = subfunction (DV v2.00+)
  1782.         01h get version
  1783.         Return: BX = version (BH = major, BL = minor)
  1784.         Note: early copies of v2.00 return 0002h
  1785.         02h get shadow buffer info, and start shadowing
  1786.         Return: BH = rows in shadow buffer
  1787.             BL = columns in shadow buffer
  1788.             DX = segment of shadow buffer
  1789.         04h get shadow buffer info
  1790.         Return: BH = rows in shadow buffer
  1791.             BL = columns in shadow buffer
  1792.             DX = segment of shadow buffer
  1793.         05h stop shadowing
  1794. Return: AL = FFh if DESQview not installed
  1795. Notes:    in DESQview v1.x, there were no subfunctions; this call only identified
  1796.       whether or not DESQview was loaded.  DESQview v2.52 performs function
  1797.       01h for all subfunction requests 0Ch and higher and appears to ignore
  1798.       all lower-numbered functions not listed here.
  1799.     DESQview versions 2.50-2.52 are part of DESQview/X v1.0x; version 2.53
  1800.       is part of DESQview/X v1.10; and version 2.63 is part of DESQview/X
  1801.       v2.00.
  1802. BUG:    subfunction 05h does not appear to work correctly in DESQview 2.52
  1803. SeeAlso: INT 10/AH=FEh,INT 10/AH=FFh,INT 15/AX=1024h,INT 15/AX=DE30h
  1804. --------U-212B--CX454C-----------------------
  1805. INT 21 - ELRES v1.1 - INSTALLATION CHECK
  1806.     AH = 2Bh
  1807.     CX = 454Ch ('EL')
  1808.     DX = 5253h ('RS')
  1809. Return: ES:BX -> ELRES history structure (see #0728)
  1810.     DX = DABEh (signature, DAve BEnnett)
  1811. Program: ELRES is an MS-DOS return code (errorlevel) recorder by David H.
  1812.       Bennett which stores recent errorlevel values, allows them to be
  1813.       retrieved for use in batch files, and can place them in an
  1814.       environment variable
  1815. SeeAlso: AH=4Bh"ELRES",AH=4Dh
  1816.  
  1817. Format of ELRES history structure:
  1818. Offset    Size    Description    (Table 0728)
  1819.  00h    WORD    number of return codes which can be stored by following buffer
  1820.  02h    WORD    current position in buffer (treated as a ring)
  1821.  04h  N BYTEs    ELRES buffer
  1822. --------l-212B00CX5643-----------------------
  1823. INT 21 - The Volkov Commander - GET POINTER TO LEFT PANEL DATA STRUCTURE
  1824.     AX = 2B00h
  1825.     CX = 5643h ('VC')
  1826.     DX = 4F4Dh ('OM')
  1827. Return: AL = 0
  1828.     ES:BX -> left panel data structure
  1829. Program: Volcov Commander is a shell for MS-DOS by Vsevolod V. Volkov
  1830. SeeAlso: AX=2B01h/CX=5643h,AX=2B02h/CX=5643h
  1831. --------l-212B01CX5643-----------------------
  1832. INT 21 - The Volkov Commander - GET POINTER TO RIGHT PANEL DATA STRUCTURE
  1833.     AX = 2B01h
  1834.     CX = 5643h ('VC')
  1835.     DX = 4F4Dh ('OM')
  1836. Return: AL = 0
  1837.     ES:BX -> right panel data structure
  1838. SeeAlso: AX=2B00h/CX=5643h,AX=2B02h/CX=5643h
  1839. --------l-212B02CX5643-----------------------
  1840. INT 21 - The Volkov Commander - GET POINTER TO GLOBAL VARIABLES
  1841.     AX = 2B02h
  1842.     CX = 5643h ('VC')
  1843.     DX = 4F4Dh ('OM')
  1844. Return: AL = 0
  1845.     ES:BX -> global variables
  1846. SeeAlso: AX=2B00h/CX=5643h,AX=2B01h/CX=5643h
  1847. --------m-212B01CX444D-----------------------
  1848. INT 21 - Quarterdeck DOS-UP.SYS v2.00 - INSTALLATION CHECK
  1849.     AX = 2B01h
  1850.     CX = 444Dh ('DM')
  1851.     DX = 4158h ('AX')
  1852. Return: AX = 0000h if installed
  1853.         BX = version??? (0002h)
  1854.         CX = 4845h ('HE')
  1855.         DX = 5245h ('RE')
  1856.         ES = DOS-UP driver segment
  1857. --------T-212B01CX5441-----------------------
  1858. INT 21 - TAME v2.10+ - INSTALLATION CHECK
  1859.     AX = 2B01h
  1860.     CX = 5441h ('TA')
  1861.     DX = 4D45h ('ME')
  1862. ---v2.60---
  1863.     BH = ???
  1864.         00h skip ???, else do
  1865. Return: AL = 02h if installed
  1866.     ES:DX -> data area in TAME-RES (see #0729,#0733,#0735)
  1867. Program: TAME is a shareware program by David G. Thomas which gives up CPU
  1868.       time to other partitions under a multitasker when the current
  1869.       partition's program incessantly polls the keyboard or system time
  1870.  
  1871. Format of TAME 2.10-2.20 data area:
  1872. Offset    Size    Description    (Table 0729)
  1873.  00h    BYTE    data structure minor version number (01h in TAME 2.20)
  1874.  01h    BYTE    data structure major version number (07h in TAME 2.20)
  1875.  02h    DWORD    number of task switches
  1876.  06h    DWORD    number of keyboard polls
  1877.  0Ah    DWORD    number of time polls
  1878.  0Eh    DWORD    number of times DESQview told program runs only in foreground
  1879.  12h    DWORD    original INT 10h
  1880.  16h    DWORD    original INT 14h
  1881.  1Ah    DWORD    original INT 15h
  1882.  1Eh    DWORD    original INT 16h
  1883.  22h    DWORD    original INT 17h
  1884.  26h    DWORD    original INT 21h
  1885.  2Ah    DWORD    original INT 28h
  1886.  2Eh    WORD    offset of TAME INT 10h handler
  1887.  30h    WORD    offset of TAME INT 14h handler
  1888.  32h    WORD    offset of TAME INT 15h handler
  1889.  34h    WORD    offset of TAME INT 16h handler
  1890.  36h    WORD    offset of TAME INT 17h handler
  1891.  38h    WORD    offset of TAME INT 21h handler
  1892.  3Ah    WORD    offset of TAME INT 28h handler
  1893.  3Ch    WORD    X in /max:X,Y or /freq:X,Y
  1894.  3Eh    WORD    Y in /max:X,Y or /freq:X,Y
  1895.  40h    WORD    number of polls remaining before next task switch
  1896.  42h    WORD    /KEYIDLE value
  1897.  44h    BYTE    interrupts already grabbed by TAME (see #0730)
  1898.  45h    BYTE    flags for interrupts which may be acted on (same bits as above)
  1899.  46h    BYTE    TAME enabled (01h) or disabled (00h)
  1900.  47h    BYTE    /TIMEPOLL (01h) or /NOTIMEPOLL (00h)
  1901.  48h    BYTE    /NOTIMER (01h) or /TIMER (00h)
  1902.  49h    BYTE    window or task number for this task
  1903.  4Ah    BYTE    multitasker type (see #0731)
  1904.  4Bh    BYTE    type of task switching selected
  1905.         bit 0: DESQview???
  1906.         bit 1: DoubleDOS???
  1907.         bit 2: TopView???
  1908.         bit 3: KeySwitch
  1909.         bit 4: HLT instruction
  1910.  4Ch    BYTE    ???
  1911.  4Dh    BYTE    flags
  1912.         bit 1: /FREQ instead of /MAX
  1913.  4Eh    BYTE    /FG: value
  1914.  4Fh    BYTE    task switches left until next FGONLY DESQview API call
  1915.  50h    BYTE    ???
  1916.  
  1917. Bitfields for interrupts already grabbed by TAME:
  1918. Bit(s)    Description    (Table 0730)
  1919.  0    INT 10h
  1920.  1    INT 14h
  1921.  2    INT 15h
  1922.  3    INT 16h
  1923.  4    INT 17h
  1924.  5    INT 21h
  1925.  6    INT 28h
  1926.  
  1927. (Table 0731)
  1928. Values for multitasker type:
  1929.  01h    DESQview
  1930.  02h    DoubleDOS
  1931.  03h    TopView
  1932.  04h    OmniView
  1933.  05h    VM/386
  1934.  
  1935. Bitfields for type of task switching selected:
  1936. Bit(s)    Description    (Table 0732)
  1937.  0    DESQview
  1938.  1    DoubleDOS
  1939.  2    TopView
  1940.  3    OmniView
  1941.  4    KeySwitch
  1942.  5    HLT instruction
  1943.  
  1944. Format of TAME 2.30 data area:
  1945. Offset    Size    Description    (Table 0733)
  1946.  00h    BYTE    data structure minor version number (02h in TAME 2.30)
  1947.  01h    BYTE    data structure major version number (0Ah in TAME 2.30)
  1948.  02h    DWORD    number of task switches
  1949.  06h    DWORD    number of keyboard polls
  1950.  0Ah    DWORD    number of time polls
  1951.  0Eh    DWORD    number of times DESQview told program runs only in foreground
  1952.  12h    DWORD    time of last /CLEAR or TAME-RES load
  1953.  16h    DWORD    time yielded
  1954.  1Ah    DWORD    time spent polling
  1955.  1Eh    DWORD    time spent waiting on key input with INT 16/AH=01h,11h
  1956.  22h    DWORD    original INT 10h
  1957.  26h    DWORD    original INT 14h
  1958.  2Ah    DWORD    original INT 15h
  1959.  2Eh    DWORD    original INT 16h
  1960.  32h    DWORD    original INT 17h
  1961.  36h    DWORD    original INT 21h
  1962.  3Ah    DWORD    original INT 28h
  1963.  3Eh    WORD    offset of TAME INT 10h handler
  1964.  40h    WORD    offset of TAME INT 14h handler
  1965.  42h    WORD    offset of TAME INT 15h handler
  1966.  44h    WORD    offset of TAME INT 16h handler
  1967.  46h    WORD    offset of TAME INT 17h handler
  1968.  48h    WORD    offset of TAME INT 21h handler
  1969.  4Ah    WORD    offset of TAME INT 28h handler
  1970.  4Ch    WORD    X in /max:X,Y or /freq:X,Y
  1971.  4Eh    WORD    Y in /max:X,Y or /freq:X,Y
  1972.  50h    WORD    number of polls remaining before next task switch
  1973.  52h    WORD    /KEYIDLE value
  1974.  54h    WORD    /FG: value
  1975.  56h    WORD    task switches left until next FGONLY DESQview API call
  1976.  58h    WORD    multitasker version
  1977.  5Ah    WORD    virtual screen segment
  1978.  5Ch    BYTE    interrupts already grabbed by TAME (see #0730)
  1979.  5Dh    BYTE    flags for interrupts which may be acted on (same bits as above)
  1980.  5Eh    BYTE    window or task number for this task
  1981.  5Fh    BYTE    multitasker type (see #0731)
  1982.  60h    BYTE    type of task switching selected (bit flags) (see #0732)
  1983.  61h    BYTE    watch_DOS
  1984.  62h    BYTE    action flags (see #0734)
  1985.  63h    BYTE    old status
  1986.  64h    WORD    signature DA34h
  1987.  
  1988. Bitfields for TAME action flags:
  1989. Bit(s)    Description    (Table 0734)
  1990.  0    TAME enabled
  1991.  1    /FREQ instead of /MAX (X and Y count fields are per tick)
  1992.  2    /TIMEPOLL
  1993.  3    /KEYPOLL
  1994.  4    inhibit timer
  1995.  5    enable status monitoring
  1996. SeeAlso: #0733,#0735
  1997.  
  1998. Format of TAME 2.60 data area:
  1999. Offset    Size    Description    (Table 0735)
  2000.  00h    BYTE    data structure minor version number (02h in TAME 2.60)
  2001.  01h    BYTE    data structure major version number (0Bh in TAME 2.60)
  2002.  02h    DWORD    number of task switches
  2003.  06h    DWORD    number of keyboard polls
  2004.  0Ah    DWORD    number of time polls
  2005.  0Eh    DWORD    number of times DESQview told program runs only in foreground
  2006.  12h    DWORD    time of last /CLEAR or TAME-RES load
  2007.  16h    DWORD    time yielded
  2008.  1Ah    DWORD    time spent polling
  2009.  1Eh    DWORD    time spent waiting on key input with INT 16/AH=01h,11h
  2010.  22h  4 BYTEs    ???
  2011.  26h    DWORD    original INT 10h
  2012.  2Ah    DWORD    original INT 14h
  2013.  2Eh    DWORD    original INT 15h
  2014.  32h    DWORD    original INT 16h
  2015.  36h    DWORD    original INT 17h
  2016.  3Ah    DWORD    original INT 21h
  2017.  3Eh    DWORD    original INT 28h
  2018.  42h    WORD    offset of TAME INT 10h handler
  2019.  44h    WORD    offset of TAME INT 14h handler
  2020.  46h    WORD    offset of TAME INT 15h handler
  2021.  48h    WORD    offset of TAME INT 16h handler
  2022.  4Ah    WORD    offset of TAME INT 17h handler
  2023.  4Ch    WORD    offset of TAME INT 21h handler
  2024.  4Eh    WORD    offset of TAME INT 28h handler
  2025.  50h    WORD    X in /max:X,Y or /freq:X,Y
  2026.  52h    WORD    Y in /max:X,Y or /freq:X,Y
  2027.  54h    WORD    number of polls remaining before next task switch
  2028.  56h    WORD    /KEYIDLE value
  2029.  58h  4 BYTEs    ???
  2030.  5Ch    WORD    X in /boost:X,Y
  2031.  5Eh    WORD    Y in /boost:X,Y
  2032.  60h    WORD    /FG: value
  2033.  62h    WORD    task switches remaining until next FGONLY DESQview API call
  2034.  64h    WORD    multitasker version ???
  2035.  66h    WORD    virtual screen segment
  2036.  68h    BYTE    interrupts already grabbed by TAME (see #0730)
  2037.  69h    BYTE    flags for interrupts which may be acted on (same bits as above)
  2038.  6Ah    BYTE    window or task number for this task
  2039.  6Bh    BYTE    multitasker type (see #0731)
  2040.  6Ch    BYTE    type of task switching selected (bit flags) (see #0732)
  2041.  6Dh    BYTE    watch_DOS
  2042.  6Eh    BYTE    action flags (see #0734)
  2043.  6Fh    BYTE    old status
  2044.  70h    WORD    signature DA34h
  2045. --------v-212B16CX0643-----------------------
  2046. INT 21 - VIRUS - "Maltese Amoeba" - INSTALLATION CHECK
  2047.     AX = 2B16h
  2048.     CX = 0643h
  2049. Return: AX = 1603h if installed
  2050. --------R-212B44BX4D41-----------------------
  2051. INT 21 - pcANYWHERE IV/LAN - INSTALLATION CHECK
  2052.     AX = 2B44h ('D')
  2053.     BX = 4D41h ('MA')
  2054.     CX = 7063h ('pc')
  2055.     DX = 4157h ('AW')
  2056. Return: AX = resident program
  2057.         4F4Bh ('OK') if large host resident
  2058.         6F6Bh ('ok') if small host resident
  2059.     CX:DX -> API entry point (see #0736)
  2060. SeeAlso: INT 16/AH=79h
  2061.  
  2062. (Table 0736)
  2063. Call pcANYWHERE API entry point with:
  2064.     AX = 0000h get pcANYWHERE IV version
  2065.         DS:SI -> BYTE buffer for host type code
  2066.         Return: AH = version number
  2067.             AL = revision number
  2068.             DS:DI buffer byte filled with
  2069.             00h full-featured host
  2070.             01h limited-feature LAN host
  2071.             other API may not be supported
  2072.     AX = 0001h initialize operation
  2073.         DS:SI -> initialization request structure (see #0737)
  2074.         Return: AX = function status (see #0740)
  2075.     AX = 0002h get status
  2076.         Return: AH = current operating mode (see #0737)
  2077.             AL = current connection status (see #0739)
  2078.     AX = 0003h suspend remote screen updates
  2079.         Return: AX = function status (see #0740)
  2080.     AX = 0004h resume screen updates
  2081.         Return: AX = function status (see #0740)
  2082.     AX = 0005h end current remote access session
  2083.         DS:SI -> termination request structure (see #0738)
  2084.         Return: AX = function status (see #0740)
  2085.     AX = 0006h remove pcANYWHERE IV from memory
  2086.         Return: AX = status (see #0740)
  2087.     AX = 8000h read data from communications channel
  2088.         DS:BX -> buffer
  2089.         CX = buffer size
  2090.         Return: AX >= number of characters read/available
  2091.             AX < 0 on error
  2092.     AX = 8001h write data to communications channel
  2093.         DS:BX -> buffer
  2094.         CX = buffer size
  2095.         Return: AX >= number of characters written
  2096.             AX < 0 on error
  2097.     AX = 8002h get connection status
  2098.         Return: AX = status
  2099.             > 0000h if connection active
  2100.             = 0000h if connection lost
  2101.             < 0000h on error
  2102.  
  2103. Format of pcANYWHERE initialization request structure:
  2104. Offset    Size    Description    (Table 0737)
  2105.  00h    BYTE    operating mode
  2106.         00h wait for a call
  2107.         01h hot key activates
  2108.         02h incoming call activates
  2109.         03h initiate a call
  2110.  01h  3 BYTEs    user ID to append to config file names
  2111.  04h    WORD    DS-relative pointer to path for config files
  2112.  06h    WORD    DS-relative pointer to path for program files
  2113.  
  2114. Format of pcANYWHERE termination request structure:
  2115. Offset    Size    Description    (Table 0738)
  2116.  00h    BYTE    operating mode after termination
  2117.         00h wait for a call
  2118.         01h hot key activates
  2119.         02h incoming call activates
  2120.         80h use current mode
  2121.         FFh remove from memory
  2122.  
  2123. Bitfields for current connection status:
  2124. Bit(s)    Description    (Table 0739)
  2125.  0    a physical connection is active
  2126.  1    remove screen updating is active
  2127.  2    connection checking is active
  2128.  3    hot key detection is active
  2129.  4    background file transfer is active
  2130.  
  2131. (Table 0740)
  2132. Values for pcANYWHERE function status:
  2133.  0000h    function completed successfully
  2134.  FFD1h    unable to release interrupt vectors
  2135.  FFD2h    unable to release allocated memory
  2136.  FFF2h    unable to establish a connection when operating mode is
  2137.       "Initiate a call"
  2138.  FFF3h    modem configuration is invalid (corrupt config)
  2139.  FFF4h    modem initialization failed (no modem response)
  2140.  FFF5h    the communications device could not be initialized
  2141.  FFF6h    the host operator aborted the function
  2142.  FFF7h    the communications driver type specified in the configuration file is
  2143.       different than the one loaded when pcANYWHERE IV was started
  2144.  FFF9h    the configuration file is invalid
  2145.  FFFAh    the configuration file could not be found
  2146.  FFFBh    no session is active
  2147.  FFFCh    a remote access session is active
  2148.  FFFDh    the specified operating mode is invalid
  2149. --------l-212B--CX5643-----------------------
  2150. INT 21 - Volkov Commander - INSTALLATION CHECK
  2151.     AH = 2Bh
  2152.     CX = 5643h ('VC')
  2153.     DX = 4F4Dh ('OM')
  2154.     AL = function number
  2155.         00h get left window data address
  2156.         01h get right window data address
  2157.         02h get address of general variables
  2158. Return: AL = 00h if Volkov Commander installed
  2159.         AH = version code (27h for v4.00.039)
  2160.         ES:BX -> requested data
  2161. Program: Volkov Commander is a Norton Commander-like DOS shell
  2162. --------G-212B--CX6269-----------------------
  2163. INT 21 - WDTSR.COM - INSTALLATION CHECK
  2164.     AH = 2Bh
  2165.     CX = 6269h ('bi')
  2166.     DX = 742Dh ('t-')
  2167. Return: AL = FFh if not installed
  2168.     AL = 77h ('w') if WDTSR is installed
  2169.         CX = 6174h ('at')
  2170.         DX = 6368h ('ch')
  2171.         ES = resident code segment
  2172.         ES:DI -> identification and configuration data
  2173. Program: WDTSR is a driver for the bitWatch watchdog hardware by bit-design
  2174.       GmbH
  2175. SeeAlso: AH=2Bh/CX=6269h"bitFOSSI",INT 14/AH=14h"FOSSIL",INT 15/AH=C3h
  2176. --------S-212B--CX6269-----------------------
  2177. INT 21 - bitFOSS - INSTALLATION CHECK
  2178.     AH = 2Bh
  2179.     CX = 6269h ('bi')
  2180.     DX = 7446h ('tF')
  2181. Return: AL = FFh if not installed
  2182.     AL = 4Fh ('O') if bitFOSS is installed
  2183.         CX = 5353h ('SS')
  2184.         DX = 494Ch ('IL')
  2185.         ES = resident code segment
  2186.         ES:DI -> identification data
  2187. Program: bitFOSS is a revision 5 FOSSIL driver
  2188. SeeAlso: AH=2Bh/CX=6269h"bitFOSSI",INT 11/AH=BCh
  2189. --------S-212B--CX6269-----------------------
  2190. INT 21 - bitFOSSI - INSTALLATION CHECK
  2191.     AH = 2Bh
  2192.     CX = 6269h ('bi')
  2193.     DX = 7449h ('tI')
  2194. Return: AL = FFh if not installed
  2195.     AL = 53h ('S') if bitFOSSI is installed
  2196.         CX = 444Eh ('DN')
  2197.         DX = 2D46h ('-F')
  2198.         ES = resident code segment
  2199.         ES:DI -> identification data
  2200. Program: bitFOSSI is a revision 5 FOSSIL driver for ???'s ISDN board
  2201. SeeAlso: AH=2Bh/CX=6269h"bitFOSS",INT 11/AH=BCh
  2202. --------D-212C-------------------------------
  2203. INT 21 - DOS 1+ - GET SYSTEM TIME
  2204.     AH = 2Ch
  2205. Return: CH = hour
  2206.     CL = minute
  2207.     DH = second
  2208.     DL = 1/100 seconds
  2209. Note:    on most systems, the resolution of the system clock is about 5/100sec,
  2210.       so returned times generally do not increment by 1
  2211.     on some systems, DL may always return 00h
  2212. SeeAlso: AH=2Ah,AH=2Dh,AH=E7h"Novell",INT 1A/AH=00h,INT 1A/AH=02h,INT 1A/AH=FEh
  2213. SeeAlso: INT 2F/AX=120Dh
  2214. --------v-212C--------------------------
  2215. INT 21 - VIRUS - "Anti Pode 2.0" - INSTALLATION CHECK
  2216.     AH = 2Ch
  2217. Return: DL = F2h if resident
  2218. SeeAlso: AX=1812h"VIRUS",AX=2C2Ch
  2219. --------v-212C00CX534B-----------------------
  2220. INT 21 - SKUDO - INSTALLATION CHECK
  2221.     AX = 2C00h
  2222.     CX = 534Bh ('SK')
  2223.     DX = 5544h ('UD')
  2224.     BX = 4F21h ('O!')
  2225. Return: AX = 5349h ('SI') if installed
  2226.         CH = version number
  2227.         CL = subversion
  2228. Program: SKUDO is an antivirus TSR by Jordi Mas
  2229. --------v-212C2C------------------------
  2230. INT 21 - VIRUS - "LockJaw/Proto-T" - INSTALLATION CHECK
  2231.     AX = 2C2Ch
  2232. Return: AX = 0DCDh if resident
  2233. SeeAlso: AH=2Ch"VIRUS",AX=3000h"VIRUS"
  2234. --------D-212D-------------------------------
  2235. INT 21 - DOS 1+ - SET SYSTEM TIME
  2236.     AH = 2Dh
  2237.     CH = hour
  2238.     CL = minute
  2239.     DH = second
  2240.     DL = 1/100 seconds
  2241. Return: AL = result
  2242.         00h successful
  2243.         FFh invalid time, system time unchanged
  2244. Note:    DOS 3.3+ also sets CMOS clock
  2245. SeeAlso: AH=2Bh"DOS",AH=2Ch,INT 1A/AH=01h,INT 1A/AH=03h,INT 1A/AH=FFh"AT&T"
  2246. --------T-212D01CX7820-----------------------
  2247. INT 21 - PC-Mix - INSTALLATION CHECK
  2248.     AX = 2D01h
  2249.     CX = 7820h ('X ')
  2250.     DX = 6D69h ('MI')
  2251. Return: AL = 00h if installed
  2252. --------D-212E--DL00-------------------------
  2253. INT 21 - DOS 1+ - SET VERIFY FLAG
  2254.     AH = 2Eh
  2255.     DL = 00h (DOS 1.x/2.x only)
  2256.     AL = new state of verify flag
  2257.         00h off
  2258.         01h on
  2259. Notes:    default state at system boot is OFF
  2260.     when ON, all disk writes are verified provided the device driver
  2261.       supports read-after-write verification
  2262. SeeAlso: AH=54h
  2263. --------D-212F-------------------------------
  2264. INT 21 - DOS 2+ - GET DISK TRANSFER AREA ADDRESS
  2265.     AH = 2Fh
  2266. Return: ES:BX -> current DTA
  2267. Note:    under the FlashTek X-32 DOS extender, the pointer is in ES:EBX
  2268. SeeAlso: AH=1Ah
  2269. --------D-2130-------------------------------
  2270. INT 21 - DOS 2+ - GET DOS VERSION
  2271.     AH = 30h
  2272. ---DOS 5+ ---
  2273.     AL = what to return in BH
  2274.         00h OEM number (as for DOS 2.0-4.0x)
  2275.         01h version flag
  2276. Return: AL = major version number (00h if DOS 1.x)
  2277.     AH = minor version number
  2278.     BL:CX = 24-bit user serial number (most versions do not use this)
  2279. ---if DOS <5 or AL=00h---
  2280.     BH = MS-DOS OEM number (see #0741)
  2281. ---if DOS 5+ and AL=01h---
  2282.     BH = version flag
  2283.         bit 3: DOS is in ROM
  2284.         other: reserved (0)
  2285. Notes:    the OS/2 v1.x Compatibility Box returns major version 0Ah (10)
  2286.     the OS/2 v2.x Compatibility Box returns major version 14h (20)
  2287.     OS/2 Warp 3.0 Virtual DOS Machines report v20.30; Warp 4 VDMs report
  2288.       v20.40.
  2289.     the WindowsNT DOS box returns version 5.00, subject to SETVER
  2290.     DOS 4.01 and 4.02 identify themselves as version 4.00; use
  2291.       INT 21/AH=87h to distinguish between the original European MS-DOS 4.0
  2292.       and the later PC-DOS 4.0x and MS-DOS 4.0x
  2293.     IBM DOS 6.1 reports its version as 6.00; use the OEM number to
  2294.       distinguish between MS-DOS 6.00 and IBM DOS 6.1 (there was never an
  2295.       IBM DOS 6.0)
  2296.     MS-DOS 6.21 reports its version as 6.20; version 6.22 returns the
  2297.       correct value
  2298.     Windows95 returns version 7.00 (the underlying MS-DOS), as did the
  2299.       "Chicago" beta (reported in _Microsoft_Systems_Journal_, August 1994)
  2300.     DR DOS 5.0 and 6.0 report version 3.31; Novell DOS 7 reports IBM v6.00,
  2301.       which some software displays as IBM DOS v6.10 (because of the version
  2302.       mismatch in true IBM DOS, as mentioned above)
  2303.     generic MS-DOS 3.30, Compaq MS-DOS 3.31, and others identify themselves
  2304.       as PC-DOS by returning OEM number 00h
  2305.     the version returned under DOS 4.0x may be modified by entries in
  2306.       the special program list (see #1003 at AH=52h); the version returned
  2307.       under DOS 5+ may be modified by SETVER--use AX=3306h to get the true
  2308.       version number
  2309. SeeAlso: AX=3000h/BX=3000h,AX=3306h,AX=4452h,AH=87h,INT 15/AX=4900h
  2310. SeeAlso: INT 2F/AX=122Fh,INT 2F/AX=4010h,INT 2F/AX=4A33h,INT 2F/AX=E002h
  2311.  
  2312. (Table 0741)
  2313. Values for DOS OEM number:
  2314.  00h    IBM
  2315.  01h    Compaq
  2316.  02h    MS Packaged Product
  2317.  04h    AT&T
  2318.  05h    ZDS (Zenith Electronics)
  2319.  06h    Hewlett-Packard
  2320.  07h    ZDS (Groupe Bull)
  2321.  0Dh    Packard-Bell
  2322.  16h    DEC
  2323.  23h    Olivetti
  2324.  28h    Texas Instruments
  2325.  29h    Toshiba
  2326.  33h    Novell (Windows/386 device IDs only)
  2327.  34h    MS Multimedia Systems (Windows/386 device IDs only)
  2328.  35h    MS Multimedia Systems (Windows/386 device IDs only)
  2329.  4Dh    Hewlett-Packard
  2330.  5Eh    RxDOS
  2331.  66h    PhysTechSoft (PTS-DOS)
  2332.  99h    General Software's Embedded DOS
  2333.  EEh    DR DOS
  2334.  EFh    Novell DOS
  2335.  FDh    FreeDOS
  2336.  FFh    Microsoft, Phoenix
  2337. --------E-2130-------------------------------
  2338. INT 21 - Phar Lap 386/DOS-Extender, Intel Code Builder - INSTALLATION CHECK
  2339.     AH = 30h
  2340.     EAX = 00003000h
  2341.     EBX = 50484152h ("PHAR")
  2342. Return: AL = major DOS version
  2343.     AH = minor DOS version
  2344.     EAX bits 31-16 = 4458h ('DX') if 386/DOS-extender installed
  2345.         BL = ASCII major version number
  2346.     EAX bits 31-16 = 4243h ('BC') if Intel Code Builder installed
  2347.         EDX = address of GDA
  2348. SeeAlso: AX=2501h,AX=FF00h,INT 2F/AX=F100h
  2349. --------v-2130--DXABCD-----------------------
  2350. INT 21 - VIRUS - "Possessed" - INSTALLATION CHECK
  2351.     AH = 30h
  2352.     DX = ABCDh
  2353. Return: DX = DCBAh if installed
  2354. SeeAlso: AX=0D20h,AH=30h/SI=1234h,AX=3000h"VIRUS",AX=30F1h
  2355. --------v-2130--SI1234---------------------
  2356. INT 21 - VIRUS - "ANDROMEDA-758" -INSTALLATION CHECK
  2357.     AH = 30h
  2358.     SI = 1234h
  2359. Return: AX = FFDDh if resident
  2360. SeeAlso: AH=30h/DX=ABCDh,AX=3000h"VIRUS"
  2361. --------T-213000BX1234-----------------------
  2362. INT 21 - CTask 2.0+ - INSTALLATION CHECK
  2363.     AX = 3000h
  2364.     BX = 1234h
  2365.     DS:DX -> 8-byte version string (DX < FFF0h) "CTask21",00h for v2.1-2.2
  2366. Return: AL = DOS major version
  2367.     AH = DOS minor version
  2368.     CX:BX -> Ctask global data block
  2369. Program: CTask is a multitasking kernel for C written by Thomas Wagner
  2370. Note:    if first eight bytes of returned data block equal eight bytes passed
  2371.       in, CTask is resident
  2372. --------O-213000BX3000-----------------------
  2373. INT 21 - PC-MOS/386 v3.0 - INSTALLATION CHECK/GET VERSION
  2374.     AX = 3000h
  2375.     BX = 3000h
  2376.     CX = DX = 3000h
  2377. Return: AX = PC-MOS version
  2378. Program: PC-MOS/386 is a multitasking/multiuser MS-DOS-compatible operating
  2379.       system by The Software Link, Inc.
  2380. SeeAlso: AH=30h,INT D4/AH=02h,INT D4/AH=10h
  2381. --------v-213000BX614A------------------
  2382. INT 21 - VIRUS - "Jackal" - INSTALLATION CHECK
  2383.     AX = 3000h
  2384.     BX = 614Ah ('aJ')
  2385.     CX = 6B63h ('kc')
  2386.     DX = 6C61h ('la')
  2387. Return: BX = ???
  2388. SeeAlso: AX=2C2Ch"VIRUS",AX=3030h"VIRUS"
  2389. --------G-213022-----------------------------
  2390. INT 21 - StopPrg v2.0 - INSTALLATION CHECK
  2391.     AX = 3022h
  2392. Return: AX = DOS version (see AH=30h)
  2393.     CX = 1112h if StopPrg installed
  2394.         BX = segment of resident code
  2395. Program: StopPrg is a resident program aborter by MAK-TRAXON's Prophet
  2396. Note:    StopPrg may be temporarily disabled by storing 9090h in the word at
  2397.       0000h:04FEh
  2398. --------v-213030-----------------------------
  2399. INT 21 - VIRUS - "IMTC" -INSTALLATION CHECK
  2400.     AX = 3030h
  2401.     BX = 694Dh
  2402. Return: DX = 7443h if resident
  2403. SeeAlso: AX=3000h/BX=614Ah"VIRUS",AX=3032h"VIRUS"
  2404. --------v-213032DX1234-----------------------
  2405. INT 21 - VIRUS - "Uruguay" - INSTALLATION CHECK
  2406.     AX = 3032h
  2407.     DX = 1234h
  2408. Return: AX = 5678h if resident
  2409. SeeAlso: AX=3030h"VIRUS",AX=30F1h"VIRUS"
  2410. --------v-2130F1-----------------------------
  2411. INT 21 - VIRUS - "Dutch-555"/"Quit 1992" - INSTALLATION CHECK
  2412.     AX = 30F1h
  2413. Return: AL = 00h if resident
  2414. SeeAlso: AH=30h/DX=ABCDh,AX=3032h,AX=330Fh,AX=33DAh
  2415. ----------2130FFCX4445-----------------------
  2416. INT 21 - DESQ??? - INSTALLATION CHECK
  2417.     AX = 30FFh
  2418.     CX = 4445h ("DE")
  2419.     DX = 5351h ("SQ")
  2420. Return: BH = 05h if installed
  2421.     ???
  2422. Note:    called by DUBLDISK.COM v2.6; this function is not supported by
  2423.       DESQview, so it may be for DESQview's precursor DESQ.
  2424. SeeAlso: AX=4404h"DUBLDISK"
  2425. --------D-2131-------------------------------
  2426. INT 21 - DOS 2+ - TERMINATE AND STAY RESIDENT
  2427.     AH = 31h
  2428.     AL = return code
  2429.     DX = number of paragraphs to keep resident
  2430. Return: never
  2431. Notes:    the value in DX only affects the memory block containing the PSP;
  2432.       additional memory allocated via AH=48h is not affected
  2433.     the minimum number of paragraphs which will remain resident is 11h
  2434.       for DOS 2.x and 06h for DOS 3.0+
  2435.     most TSRs can save some memory by releasing their environment block
  2436.       before terminating (see #0725 at AH=26h,AH=49h)
  2437.     any open files remain open, so one should close any files which will
  2438.       not be used before going resident; to access a file which is left
  2439.       open from the TSR, one must switch PSP segments first (see AH=50h)
  2440. SeeAlso: AH=00h,AH=4Ch,AH=4Dh,INT 20,INT 22,INT 27
  2441. --------D-2132-------------------------------
  2442. INT 21 - DOS 2+ - GET DOS DRIVE PARAMETER BLOCK FOR SPECIFIC DRIVE
  2443.     AH = 32h
  2444.     DL = drive number (00h = default, 01h = A:, etc)
  2445. Return: AL = status
  2446.         00h successful
  2447.         DS:BX -> Drive Parameter Block (DPB) (see #0742) for specified
  2448.               drive
  2449.         FFh invalid or network drive
  2450. Notes:    the OS/2 compatibility box supports the DOS 3.3 version of this call
  2451.       except for the DWORD at offset 12h
  2452.     this call updates the DPB by reading the disk; the DPB may be accessed
  2453.       via the DOS list of lists (see #0968 at AH=52h) if disk access is not
  2454.       desirable.
  2455.     undocumented prior to the release of DOS 5.0; only the DOS 4.0+
  2456.       version of the DPB has been documented, however
  2457.     supported by DR DOS 3.41+; DR DOS 3.41-6.0 return the same data as
  2458.       MS-DOS 3.31
  2459.     IBM ROM-DOS v4.0 also reports invalid/network (AL=FFh) on the ROM drive
  2460. SeeAlso: AH=1Fh,AH=52h,AX=7302h
  2461.  
  2462. Format of DOS Drive Parameter Block:
  2463. Offset    Size    Description    (Table 0742)
  2464.  00h    BYTE    drive number (00h = A:, 01h = B:, etc)
  2465.  01h    BYTE    unit number within device driver
  2466.  02h    WORD    bytes per sector
  2467.  04h    BYTE    highest sector number within a cluster
  2468.  05h    BYTE    shift count to convert clusters into sectors
  2469.  06h    WORD    number of reserved sectors at beginning of drive
  2470.  08h    BYTE    number of FATs
  2471.  09h    WORD    number of root directory entries
  2472.  0Bh    WORD    number of first sector containing user data
  2473.  0Dh    WORD    highest cluster number (number of data clusters + 1)
  2474.         16-bit FAT if greater than 0FF6h, else 12-bit FAT
  2475.  0Fh    BYTE    number of sectors per FAT
  2476.  10h    WORD    sector number of first directory sector
  2477.  12h    DWORD    address of device driver header (see #0987)
  2478.  16h    BYTE    media ID byte (see #0703)
  2479.  17h    BYTE    00h if disk accessed, FFh if not
  2480.  18h    DWORD    pointer to next DPB
  2481. ---DOS 2.x---
  2482.  1Ch    WORD    cluster containing start of current directory, 0000h=root,
  2483.         FFFFh = unknown
  2484.  1Eh 64 BYTEs    ASCIZ pathname of current directory for drive
  2485. ---DOS 3.x---
  2486.  1Ch    WORD    cluster at which to start search for free space when writing
  2487.  1Eh    WORD    number of free clusters on drive, FFFFh = unknown
  2488. ---DOS 4.0-6.0---
  2489.  0Fh    WORD    number of sectors per FAT
  2490.  11h    WORD    sector number of first directory sector
  2491.  13h    DWORD    address of device driver header (see #0987)
  2492.  17h    BYTE    media ID byte (see #0703)
  2493.  18h    BYTE    00h if disk accessed, FFh if not
  2494.  19h    DWORD    pointer to next DPB
  2495.  1Dh    WORD    cluster at which to start search for free space when writing,
  2496.         usually the last cluster allocated
  2497.  1Fh    WORD    number of free clusters on drive, FFFFh = unknown
  2498. SeeAlso: #1004,#3295 at AX=7302h
  2499. --------D-2133-------------------------------
  2500. INT 21 - DOS 2+ - EXTENDED BREAK CHECKING
  2501.     AH = 33h
  2502.     AL = subfunction
  2503.         00h get current extended break state
  2504.         Return: DL = current state, 00h = off, 01h = on
  2505.         01h set state of extended ^C/^Break checking
  2506.         DL = new state
  2507.             00h off, check only on character I/O functions
  2508.             01h on, check on all DOS functions
  2509.         Return: (Novell DOS 7) DL = old state of extended Break checks
  2510. Note:    under DOS 3.1+ and DR DOS, this function does not use any of the
  2511.       DOS-internal stacks and may thus be called at any time
  2512. SeeAlso: AX=3302h
  2513. --------D-213302-----------------------------
  2514. INT 21 - DOS 3.x+ internal - GET AND SET EXTENDED CONTROL-BREAK CHECKING STATE
  2515.     AX = 3302h
  2516.     DL = new state (00h for OFF, 01h for ON)
  2517. Return: DL = old state of extended BREAK checking
  2518. Notes:    this function does not use any of the DOS-internal stacks and may thus
  2519.       be called at any time; one possible use is modifying Control-Break
  2520.       checking from within an interrupt handler or TSR
  2521.     not supported by DR DOS through version 6.0 (error code 01h);
  2522.       newly-supported by Novell DOS 7
  2523. SeeAlso: AH=33h
  2524. --------D-213303-----------------------------
  2525. INT 21 - DOS 4.0+ - UNUSED
  2526.     AX = 3303h
  2527. Return: nothing
  2528. Note:    this function and AX=3304h were intended to support a proposed
  2529.       code-page switching flag (using two of the ten reserved bytes in
  2530.       the DOS directory entry for codepage information); however, this
  2531.       function has always been a NOP in public releases of DOS and OS/2.
  2532.       See _DOS_Internals_ Chapter 2 for more information
  2533. SeeAlso: AX=3304h
  2534. --------D-213304-----------------------------
  2535. INT 21 - DOS 4.0+ - UNUSED
  2536.     AX = 3304h
  2537. Return: nothing
  2538. Note:    this function and AX=3303h were intended to support a proposed
  2539.       code-page switching flag (using two of the ten reserved bytes in
  2540.       the DOS directory entry for codepage information); however, this
  2541.       function has always been a NOP in public releases of DOS and OS/2.
  2542.       See _DOS_Internals_ Chapter 2 for more information
  2543. SeeAlso: AX=3303h
  2544. --------D-213305-----------------------------
  2545. INT 21 - DOS 4.0+ - GET BOOT DRIVE
  2546.     AX = 3305h
  2547. Return: DL = boot drive (1=A:,...)
  2548. Notes:    fully reentrant
  2549.     NEC 9800-series PCs always call the boot drive A: and assign the other
  2550.       drive letters sequentially to the other drives in the system
  2551.     this call is supported by OS/2 Warp 3.0, but not earlier versions of
  2552.       OS/2; it is also supported by Novell DOS 7
  2553. --------D-213306-----------------------------
  2554. INT 21 - DOS 5+ - GET TRUE VERSION NUMBER
  2555.     AX = 3306h
  2556. Return: BL = major version
  2557.     BH = minor version
  2558.     DL = revision (bits 2-0, all others 0)
  2559.     DH = version flags
  2560.         bit 3: DOS is in ROM
  2561.         bit 4: DOS is in HMA
  2562.     AL = FFh if true DOS version < 5.0
  2563. Notes:    this function always returns the true version number, unlike AH=30h,
  2564.       whose return value may be changed with SETVER
  2565.     because of the conflict from the CBIS redirector (see next
  2566.       entry), programs should check whether BH is less than 100 (64h)
  2567.       and BL is at least 5 before accepting the returned BX as the true
  2568.       version number; however, even this is not entirely reliable when
  2569.       that redirector is loaded
  2570.     fully reentrant
  2571.     OS/2 v2.1 will return BX=0A14h (version 20.10)
  2572.     the Windows NT DOS box returns BX=3205h (version 5.50)
  2573.     Novell DOS 7 returns IBM v6.00, which some software displays as
  2574.       IBM DOS v6.10 (because of the version mismatch in true IBM DOS
  2575.       mentioned for INT 21/AH=30h); versions through Update 15 all
  2576.       return revision code 00h
  2577. BUG:    DR DOS 5.0 and 6.0 return CF set/AX=0001h for INT 21/AH=33h
  2578.       subfunctions other than 00h-02h and 05h, while MS-DOS returns AL=FFh
  2579.       for invalid subfunctions
  2580. SeeAlso: AH=30h,INT 2F/AX=122Fh,INT 2F/AX=E000h"SETDRVER"
  2581. --------N-213306-----------------------------
  2582. INT 21 - CBIS network - NETWORK REDIRECTOR - ???
  2583.     AX = 3306h
  2584. Return: AX = 3306h
  2585.     BL = ??? (usually 00h)
  2586.     BH = ??? (usually 00h or FFh)
  2587. Note:    unknown function, is in conflict with DOS 5+ version call
  2588. SeeAlso: AX=3306h"DOS"
  2589. --------v-21330F-----------------------------
  2590. INT 21 - VIRUS - "Burghofer" - INSTALLATION CHECK
  2591.     AX = 330Fh
  2592. Return: AL = 0Fh if resident (DOS returns AL=FFh)
  2593. SeeAlso: AX=30F1h,AX=33DAh,AX=33E0h
  2594. --------k-213341-----------------------------
  2595. INT 21 - Diet Disk v1.0 - INSTALLATION CHECK
  2596.     AX = 3341h
  2597. Return: DX = 1234h if installed
  2598.         CX = resident code segment
  2599. Program: Diet Disk is a public domain transparent data file compressor by
  2600.       Barry Nance
  2601. --------v-2133DA------------------------
  2602. INT 21 - VIRUS - "CoffeeShop" - INSTALLATION CHECK
  2603.     AX = 33DAh
  2604. Return: AH = A5h if resident
  2605.         AL = virus version
  2606. SeeAlso: AX=330Fh,AX=33E0h,AX=5643h"VIRUS"
  2607. --------v-2133E0-----------------------------
  2608. INT 21 - VIRUS - "Oropax" - INSTALLATION CHECK
  2609.     AX = 33E0h
  2610. Return: AL = E0h if resident (DOS returns AL=FFh)
  2611. SeeAlso: AX=330Fh,AX=33DAh,AX=357Fh
  2612. --------D-2134-------------------------------
  2613. INT 21 - DOS 2+ - GET ADDRESS OF INDOS FLAG
  2614.     AH = 34h
  2615. Return: ES:BX -> one-byte InDOS flag
  2616. Notes:    this function executes on the DOS stack, and thus cannot be called
  2617.       while another DOS function is already executing; you should use
  2618.       this function once at the beginning of the program and store the
  2619.       returned pointer rather than calling it when requiring DOS access
  2620.     the value of InDOS is incremented whenever an INT 21 function begins
  2621.       and decremented whenever one completes
  2622.     during an INT 28 call, it is safe to call some INT 21 functions even
  2623.       though InDOS may be 01h instead of zero
  2624.     InDOS alone is not sufficient for determining when it is safe to
  2625.       enter DOS, as the critical error handling decrements InDOS and
  2626.       increments the critical error flag for the duration of the critical
  2627.       error.  Thus, it is possible for InDOS to be zero even if DOS is
  2628.       busy.
  2629.     SMARTDRV 4.0 sets the InDOS flag while flushing its buffers to disk,
  2630.       then zeros it on completion
  2631.     the critical error flag is the byte immediately following InDOS in
  2632.       DOS 2.x, and the byte BEFORE the InDOS flag in DOS 3.0+ and
  2633.       DR DOS 3.41+ (except COMPAQ DOS 3.0, where the critical error flag
  2634.       is located 1AAh bytes BEFORE the critical section flag)
  2635.     for DOS 3.1+, an undocumented call exists to get the address of the
  2636.       critical error flag (see AX=5D06h)
  2637.     this function was undocumented prior to the release of DOS 5.0.
  2638. SeeAlso: AX=5D06h,AX=5D0Bh,INT 15/AX=DE1Fh,INT 28
  2639. --------D-2135-------------------------------
  2640. INT 21 - DOS 2+ - GET INTERRUPT VECTOR
  2641.     AH = 35h
  2642.     AL = interrupt number
  2643. Return: ES:BX -> current interrupt handler
  2644. Note:    under DR DOS 5.0+, this function does not use any of the DOS-internal
  2645.       stacks and may thus be called at any time
  2646. SeeAlso: AH=25h,AX=2503h
  2647. --------E-213501-----------------------------
  2648. INT 21 P - FlashTek X-32VM - ALLOCATE PROTECTED-MODE SELECTOR
  2649.     AX = 3501h
  2650. Return: CF clear if successful
  2651.         BX = new selector
  2652.     CF set on error (no more selectors available)
  2653. Note:    the new selector will be an expand-up read/write data selector with
  2654.       undefined base and limit
  2655. SeeAlso: AX=3502h,INT 31/AX=0000h
  2656. --------E-213502-----------------------------
  2657. INT 21 P - FlashTek X-32VM - DEALLOCATE PROTECTED-MODE SELECTOR
  2658.     AX = 3502h
  2659.     BX = selector
  2660. Return: CF clear if successful
  2661.     CF set on error (invalid selector)
  2662. Note:    only selectors allocated via AX=3501h should be deallocated
  2663. SeeAlso: AX=3501h,INT 31/AX=0001h
  2664. --------E-213503-----------------------------
  2665. INT 21 P - FlashTek X-32VM - SET SELECTOR BASE ADDRESS
  2666.     AX = 3503h
  2667.     BX = selector
  2668.     ECX = base address
  2669. Return: CF clear if successful
  2670.     CF set on error (invalid selector)
  2671. SeeAlso: AX=3504h,AX=3505h,INT 31/AX=0007h
  2672. --------E-213504-----------------------------
  2673. INT 21 P - FlashTek X-32VM - GET SELECTOR BASE ADDRESS
  2674.     AX = 3504h
  2675.     BX = selector
  2676. Return: CF clear if successful
  2677.         ECX = absolute base address of selector
  2678.     CF set on error (invalid selector)
  2679. SeeAlso: AX=3503h,INT 31/AX=0006h
  2680. --------E-213505-----------------------------
  2681. INT 21 P - FlashTek X-32VM - SET SELECTOR LIMIT
  2682.     AX = 3505h
  2683.     BX = selector
  2684.     ECX = desired limit
  2685. Return: CF clear if successful
  2686.         ECX = actual limit set
  2687.     CF set on error (no more selectors available)
  2688. Note:    the limit will be rounded down to nearest 4K boundary if the requested
  2689.       limit is greater than 1MB
  2690. SeeAlso: AX=3503h,INT 31/AX=0008h
  2691. --------E-21350A-----------------------------
  2692. INT 21 P - FlashTek X-32VM - PHYSICAL ADDRESS MAPPING
  2693.     AX = 350Ah
  2694.     EBX = absolute physical address
  2695.     ECX = size in bytes of area to map
  2696. Return: CF clear if successful
  2697.     CF set on error (insufficient memory or service refused by DPMI host)
  2698. Notes:    should not make repeated calls for the same physical address
  2699.     there is no provision for unmapping memory
  2700. --------E-21350B-----------------------------
  2701. INT 21 P - FlashTek X-32VM - UPDATE AND RETURN AVAILABLE FREE MEMORY
  2702.     AX = 350Bh
  2703.     DS = default selector for DS
  2704. Return: CF clear
  2705.     EAX = maximum amount of memory which can be allocated via AX=350Ch
  2706. SeeAlso: AX=350Ch
  2707. --------E-21350C-----------------------------
  2708. INT 21 P - FlashTek X-32VM - ALLOCATE A BLOCK OF MEMORY
  2709.     AX = 350Ch
  2710.     ECX = size of block in bytes
  2711.     DS = default DS
  2712. Return: CF clear if successful
  2713.         EAX = near pointer to new block
  2714.         EDX = new lowest legal value for stack
  2715.     CF set on error (requested size not multiple of 4K)
  2716. SeeAlso: AX=350Bh,AX=350Dh
  2717. --------E-21350D-----------------------------
  2718. INT 21 P - FlashTek X-32VM - RESERVE BLOCK OF MEMORY FOR 32-BIT STACK
  2719.     AX = 350Dh
  2720.     EBX = current ESP value
  2721.     ECX = size of block in bytes
  2722.     DS = default DS
  2723. Return: CF clear if successful
  2724.         EBX = new value for ESP
  2725.         EDX = suggested new limit for SS
  2726.     CF set on error
  2727. Note:    this function should only be called once during initialization
  2728. SeeAlso: AX=350Bh,AX=350Ch
  2729. --------v-21357F-----------------------------
  2730. INT 21 - VIRUS - "Agiplan"/"Month 4-6" - INSTALLATION CHECK
  2731.     AX = 357Fh
  2732. Return: DX = FFFFh if installed
  2733. SeeAlso: AX=33E0h,AX=3DFFh
  2734. --------D-2136-------------------------------
  2735. INT 21 - DOS 2+ - GET FREE DISK SPACE
  2736.     AH = 36h
  2737.     DL = drive number (00h = default, 01h = A:, etc)
  2738. Return: AX = FFFFh if invalid drive
  2739.     else
  2740.         AX = sectors per cluster
  2741.         BX = number of free clusters
  2742.         CX = bytes per sector
  2743.         DX = total clusters on drive
  2744. Notes:    free space on drive in bytes is AX * BX * CX
  2745.     total space on drive in bytes is AX * CX * DX
  2746.     "lost clusters" are considered to be in use
  2747.     according to Dave Williams' MS-DOS reference, the value in DX is
  2748.       incorrect for non-default drives after ASSIGN is run
  2749.     this function does not return proper results on CD-ROMs;
  2750.       use AX=4402h"CD-ROM" instead
  2751.     (FAT32 drive) the reported total and free space are limited to 2G-32K
  2752.       should they exceed that value
  2753. SeeAlso: AH=1Bh,AH=1Ch,AX=4402h"CD-ROM",AX=7303h
  2754. --------D-213700-----------------------------
  2755. INT 21 - DOS 2+ - "SWITCHAR" - GET SWITCH CHARACTER
  2756.     AX = 3700h
  2757. Return: AL = status
  2758.         00h successful
  2759.         DL = current switch character
  2760.         FFh unsupported subfunction
  2761. Desc:    Determine the character which is used to introduce command switches.
  2762.       This setting is ignored by MS-DOS commands in version 4.0 and higher,
  2763.       but is honored by many third-party programs and by Novell DOS 7
  2764.       external commands
  2765. BUG:    Novell DOS 7's COMMAND.COM fails to honor the SwitChar setting for
  2766.       internal commands even though COMMAND.COM honors it in its own
  2767.       command tail (i.e. COMMAND /?)
  2768. Notes:    documented in some OEM versions of some releases of DOS
  2769.     supported by OS/2 compatibility box
  2770.     always returns AL=00h/DL=2Fh for MS-DOS 5+ and DR DOS 3.41-6.0
  2771.     Novell DOS 7 COMMAND.COM indicates switch characters other than '/'
  2772.       by changing the first backslash (and only the first one) in the
  2773.       path it prints for PROMPT $p with a forward slash
  2774. SeeAlso: AX=3701h
  2775. --------D-213701-----------------------------
  2776. INT 21 - DOS 2+ - "SWITCHAR" - SET SWITCH CHARACTER
  2777.     AX = 3701h
  2778.     DL = new switch character
  2779. Return: AL = status
  2780.         00h successful
  2781.         FFh unsupported subfunction
  2782. Notes:    documented in some OEM versions of some releases of DOS
  2783.     supported by OS/2 compatibility box and Novell DOS 7
  2784.     ignored by MS-DOS 5+ and DR DOS 3.41-6.0; DR DOS 6.0 and Novell DOS 7
  2785.       leave AX unchanged
  2786. SeeAlso: AX=3700h
  2787. --------D-2137-------------------------------
  2788. INT 21 - DOS 2.x and 3.3+ only - "AVAILDEV" - SPECIFY \DEV\ PREFIX USE
  2789.     AH = 37h
  2790.     AL = subfunction
  2791.         02h get availdev flag
  2792.         Return: DL = 00h \DEV\ must precede character device names
  2793.                = nonzero \DEV\ is optional
  2794.         03h set availdev flag
  2795.         DL = new state
  2796.             00h        \DEV\ is mandatory
  2797.             nonzero    \DEV\ is optional
  2798. Return: AL = status
  2799.         00h successful
  2800.         FFh unsupported subfunction
  2801. Notes:    all versions of DOS from 2.00 allow \DEV\ to be prepended to device
  2802.       names without generating an error even if the directory \DEV does
  2803.       not actually exist (other paths generate an error if they do not
  2804.       exist).
  2805.     although MS-DOS 3.3+, DR DOS 3.41+, and Novell DOS 7 accept these
  2806.       calls, they have no effect, and AL=02h always returns DL=FFh (except
  2807.       for Novell DOS 7, which leaves AX unchanged for both subfunctions)
  2808. --------k-2137D0BX899D-----------------------
  2809. INT 21 - DIET v1.43e - TSR INSTALLATION CHECK
  2810.     AX = 37D0h
  2811.     BX = 899Dh ('DI' + 'ET')
  2812. Return: AL = FFh if not present as TSR (default return value from DOS)
  2813.     AX = 0000h if installed as a TSR
  2814.         CX = 899Dh
  2815.         DX = version ID
  2816. Program: DIET is a transparent file copressor/decompressor by Teddy Matsumoto
  2817. SeeAlso: AX=37D1h,AX=37D2h,AX=37D4h,AX=37D6h,AX=37DFh,AX=4BF0h,AX=4BF1h
  2818. --------k-2137D1BX899D-----------------------
  2819. INT 21 - DIET v1.43e - GET DIET.EXE RESIDENT SEGMENT
  2820.     AX = 37D1h
  2821.     BX = 899Dh ('DI' + 'ET')
  2822. Return: AX = 0000h
  2823.     CX = code segment of TSR part of DIET.EXE
  2824.     DX = memory block segment of TSR DIET.EXE
  2825.         (0000h if installed as device driver)
  2826. SeeAlso: AX=37D0h,AX=37DFh
  2827. --------k-2137D2BX899D-----------------------
  2828. INT 21 - DIET v1.43e - GET TSR CONTROL FLAGS
  2829.     AX = 37D2h
  2830.     BX = 899Dh ('DI' + 'ET')
  2831. Return: AX = 0000h
  2832.     DL = control flag (00h active, else disabled)
  2833.     DH = skip flag (nonzero while TSR active)
  2834. SeeAlso: AX=37D0h,AX=37D3h,AX=37D4h
  2835. --------k-2137D3BX899D-----------------------
  2836. INT 21 - DIET v1.43e - SET TSR CONTROL FLAGS
  2837.     AX = 37D3h
  2838.     BX = 899Dh ('DI' + 'ET')
  2839.     DL = control flag (00h active, else disabled)
  2840.     DH = skip flag (00h)
  2841. Return: AX = 0000h
  2842. SeeAlso: AX=37D0h,AX=37D2h,AX=37D5h
  2843. --------k-2137D4BX899D-----------------------
  2844. INT 21 - DIET v1.43e - GET TSR OPTIONS
  2845.     AX = 37D4h
  2846.     BX = 899Dh ('DI' + 'ET')
  2847. Return: AX = 0000h
  2848.     DX = TSR options (see #0743)
  2849. SeeAlso: AX=37D0h,AX=37D2h,AX=37D5h
  2850.  
  2851. Bitfields for DIET TSR options:
  2852. Bit(s)    Description    (Table 0743)
  2853.  0    automated compression of DIETed file
  2854.  1    automated compression of newly-created file
  2855.  2    suppress DIET message
  2856.  3    display original file size
  2857.  4-15    reserved (0)
  2858. --------k-2137D5BX899D-----------------------
  2859. INT 21 - DIET v1.43e - SET TSR OPTIONS
  2860.     AX = 37D5h
  2861.     BX = 899Dh ('DI' + 'ET')
  2862.     DX = TSR options (see #0743)
  2863. Return: AX = 0000h
  2864. Program: DIET is a transparent file copressor/decompressor by Teddy Matsumoto
  2865. SeeAlso: AX=37D0h,AX=37D3h,AX=37D4h
  2866. --------k-2137D6BX899D-----------------------
  2867. INT 21 - DIET v1.43e - GET TEMPORARY DIRECTORY NAMES
  2868.     AX = 37D6h
  2869.     BX = 899Dh ('DI' + 'ET')
  2870. Return: AX = 0000h
  2871.     DS:DX -> name of temporary directory or 0000h:0000h for current dir
  2872. SeeAlso: AX=37D0h,AX=37D7h
  2873. --------k-2137D7BX899D-----------------------
  2874. INT 21 - DIET v1.43e - SET TEMPORARY DIRECTORY NAMES
  2875.     AX = 37D7h
  2876.     BX = 899Dh ('DI' + 'ET')
  2877.     DS:DX -> ASCIZ name of temporary directory (max 61 chars)
  2878.         0000h:0000h for current directory
  2879. Return: AX = 0000h
  2880. Note:    the specified directory name must include a drive letter and end with
  2881.       a backslash
  2882. SeeAlso: AX=37D0h,AX=37D6h
  2883. --------k-2137DCBX899D-----------------------
  2884. INT 21 - DIET v1.43e - SET ADDRESS OF EXTERNAL PROCEDURE
  2885.     AX = 37DCh
  2886.     BX = 899Dh ('DI' + 'ET')
  2887.     DS:DX -> external procedure (see #0744)
  2888. Return: AX = 0000h
  2889. Note:    the resident code will call the specified external procedure at the
  2890.       beginning of decompression and when compression is exited on failure
  2891. SeeAlso: AX=37DDh
  2892.  
  2893. (Table 0744)
  2894. Values DIET external procedure is called with:
  2895.     STACK:    WORD    class
  2896.             FFFDh creation failed for unknown reasons
  2897.             FFFEh creation failed due to lack of space
  2898.             FFFFh file creation error
  2899.             else file handle of DIETed file to be decompressed
  2900.         DWORD    -> compressed filename
  2901.         DWORD    -> decompressed or temporary filename
  2902. Return: SI,DI,BP,DS,ES must be preserved by external procedure
  2903. --------k-2137DDBX899D-----------------------
  2904. INT 21 - DIET v1.43e - RELEASE EXTERNAL PROCEDURE
  2905.     AX = 37DDh
  2906.     BX = 899Dh ('DI' + 'ET')
  2907. Program: DIET is a transparent file copressor/decompressor by Teddy Matsumoto
  2908. Note:    unlinks the external procedure specified by AX=37DCh
  2909. SeeAlso: AX=37DCh
  2910. --------k-2137DEBX899D-----------------------
  2911. INT 21 - DIET v1.43e - READ EMS STATUS
  2912.     AX = 37DEh
  2913.     BX = 899Dh ('DI' + 'ET')
  2914. Return: AX = 0000h
  2915.     CX = EMS status
  2916.         0000h not used
  2917.         0001h used as work area
  2918.         0002h used for code and as work area
  2919.     DX = EMM handle when EMS is in use
  2920. --------k-2137A0BX6A6D-----------------------
  2921. INT 21 - XPACK v1.52 - INSTALLATION CHECK
  2922.     AX = 37A0h
  2923.     BX = 6A6Dh
  2924. Return: AL = FFh if not present as TSR (default return value from DOS)
  2925.     AX = 0000h if installed as a TSR
  2926.         CX = 6A6Dh ('jm')
  2927.         DX = version ID (0152h)
  2928. Program: XPACK is a transparent file compressor/decompressor by JauMing Tseng
  2929. SeeAlso: AX=37A1h/BX=6A6Dh,AX=37A2h/BX=6A6Dh,AX=37A3h/BX=6A6Dh
  2930. --------k-2137A1BX6A6D-----------------------
  2931. INT 21 - XPACK v1.52 - UNINSTALL TSR
  2932.     AX = 37A1h
  2933.     BX = 6A6Dh
  2934. Return: AX = status
  2935.         0000h successful
  2936.         FFFFh failed
  2937. Program: XPACK is a transparent file compressor/decompressor by JauMing Tseng
  2938. SeeAlso: AX=37A0h/BX=6A6Dh,AX=37A2h/BX=6A6Dh,AX=37A3h/BX=6A6Dh
  2939. --------k-2137A2BX6A6D-----------------------
  2940. INT 21 - XPACK v1.52 - GET TSR STATUS
  2941.     AX = 37A2h
  2942.     BX = 6A6Dh
  2943. Return: AX = 0000h (successful)
  2944.     DL = status (01h active, 00h disabled)
  2945. SeeAlso: AX=37A0h/BX=6A6Dh,AX=37A1h/BX=6A6Dh,AX=37A3h/BX=6A6Dh
  2946. --------k-2137A3BX6A6D-----------------------
  2947. INT 21 - XPACK v1.52 - SET TSR STATUS
  2948.     AX = 37A3h
  2949.     BX = 6A6Dh
  2950.     DL = status (01h active, 00h disabled)
  2951. Return: AX = 0000h (successful)
  2952. SeeAlso: AX=37A0h/BX=6A6Dh,AX=37A1h/BX=6A6Dh,AX=37A2h/BX=6A6Dh
  2953. --------k-2137DFBX899D-----------------------
  2954. INT 21 - DIET v1.43e - UNINSTALL TSR
  2955.     AX = 37DFh
  2956.     BX = 899Dh ('DI' + 'ET')
  2957. Return: AX = status
  2958.         0000h successful
  2959.         00FFh failed
  2960. Program: DIET is a transparent file copressor/decompressor by Teddy Matsumoto
  2961. SeeAlso: AX=37D0h
  2962. Index:    uninstall;DIET
  2963. --------D-2138-------------------------------
  2964. INT 21 - DOS 2+ - GET COUNTRY-SPECIFIC INFORMATION
  2965.     AH = 38h
  2966. --DOS 2.x--
  2967.     AL = 00h get current-country info
  2968.     DS:DX -> buffer for returned info (see #0745,#0746)
  2969. Return: CF set on error
  2970.         AX = error code (02h)
  2971.     CF clear if successful
  2972.         AX = country code (MS-DOS 2.11 only)
  2973.         buffer at DS:DX filled
  2974. --DOS 3.0+--
  2975.     AL = 00h for current country
  2976.     AL = 01h thru 0FEh for specific country with code <255 (see #0747)
  2977.     AL = 0FFh for specific country with code >= 255
  2978.        BX = 16-bit country code (see #0747)
  2979.     DS:DX -> buffer for returned info (see #0746)
  2980. Return: CF set on error
  2981.         AX = error code (02h)
  2982.     CF clear if successful
  2983.         AX = country code (Novell NWDOS v7.0)
  2984.         BX = country code
  2985.         DS:DX buffer filled
  2986. Note:    this function is not supported by the Borland DPMI host, but no error
  2987.       is returned; as a workaround, one should allocate a buffer in
  2988.       conventional memory with INT 31/AX=0100h and simulate an INT 21 with
  2989.       INT 31/AX=0300h
  2990. SeeAlso: AH=65h,INT 10/AX=5001h,INT 2F/AX=110Ch,INT 2F/AX=1404h
  2991.  
  2992. Format of DOS 2.00-2.10 country info:
  2993. Offset    Size    Description    (Table 0745)
  2994.  00h    WORD    date format  0 = USA    mm dd yy
  2995.                  1 = Europe dd mm yy
  2996.                  2 = Japan    yy mm dd
  2997.  02h    BYTE    currency symbol
  2998.  03h    BYTE    00h
  2999.  04h    BYTE    thousands separator char
  3000.  05h    BYTE    00h
  3001.  06h    BYTE    decimal separator char
  3002.  07h    BYTE    00h
  3003.  08h 24 BYTEs    reserved
  3004.  
  3005. Format of DOS 2.11+ country info:
  3006. Offset    Size    Description    (Table 0746)
  3007.  00h    WORD    date format (see #0745)
  3008.  02h  5 BYTEs    ASCIZ currency symbol string
  3009.  07h  2 BYTEs    ASCIZ thousands separator
  3010.  09h  2 BYTEs    ASCIZ decimal separator
  3011.  0Bh  2 BYTEs    ASCIZ date separator
  3012.  0Dh  2 BYTEs    ASCIZ time separator
  3013.  0Fh    BYTE    currency format
  3014.         bit 2 = set if currency symbol replaces decimal point
  3015.         bit 1 = number of spaces between value and currency symbol
  3016.         bit 0 = 0 if currency symbol precedes value
  3017.             1 if currency symbol follows value
  3018.  10h    BYTE    number of digits after decimal in currency
  3019.  11h    BYTE    time format
  3020.         bit 0 = 0 if 12-hour clock
  3021.             1 if 24-hour clock
  3022.  12h    DWORD    address of case map routine
  3023.         (FAR CALL, AL = character to map to upper case [>= 80h])
  3024.  16h  2 BYTEs    ASCIZ data-list separator
  3025.  18h 10 BYTEs    reserved
  3026.  
  3027. (Table 0747) Values for country code:
  3028.  001h    United States
  3029.  002h    Canadian-French
  3030.  003h    Latin America
  3031.  014h    Egypt
  3032.  01Bh    South Africa
  3033.  01Eh    Greece
  3034.  01Fh    Netherlands
  3035.  020h    Belgium
  3036.  021h    France
  3037.  022h    Spain
  3038.  024h    Hungary (not supported by DR DOS 5.0)
  3039.  026h    Yugoslavia (not supported by DR DOS 5.0) -- obsolete
  3040.  027h    Italy / San Marino / Vatican City
  3041.  028h    Romania
  3042.  029h    Switzerland / Liechtenstein
  3043.  02Ah    Czechoslovakia / Tjekia (not supported by DR DOS 5.0)
  3044.  02Bh    Austria (DR DOS 5.0)
  3045.  02Ch    United Kingdom
  3046.  02Dh    Denmark
  3047.  02Eh    Sweden
  3048.  02Fh    Norway
  3049.  030h    Poland (not supported by DR DOS 5.0)
  3050.  031h    Germany
  3051.  033h    Peru
  3052.  034h    Mexico
  3053.  035h    Cuba
  3054.  036h    Argentina
  3055.  037h    Brazil (not supported by DR DOS 5.0)
  3056.  038h    Chile
  3057.  039h    Columbia
  3058.  03Ah    Venezuela
  3059.  03Ch    Malaysia
  3060.  03Dh    International English / Australia
  3061.  03Eh    Indonesia / East Timor
  3062.  03Fh    Philippines
  3063.  040h    New Zealand
  3064.  041h    Singapore
  3065.  051h    Japan (DR DOS 5.0, MS-DOS 5.0+)
  3066.  052h    South Korea (DR DOS 5.0)
  3067.  054h    Vietnam
  3068.  056h    China (MS-DOS 5.0+)
  3069.  058h    Taiwan (MS-DOS 5.0+)
  3070.  05Ah    Turkey (MS-DOS 5.0+)
  3071.  05Bh    India
  3072.  05Ch    Pakistan
  3073.  05Dh    Afghanistan
  3074.  05Eh    Sri Lanka
  3075.  062h    Iran
  3076.  063h    Asian English
  3077.  070h    Belarus
  3078.  0C8h    Thailand
  3079.  0D4h    Morocco
  3080.  0D5h    Algeria
  3081.  0D8h    Tunisia
  3082.  0DAh    Libya
  3083.  0DCh    Gambia
  3084.  0DDh    Senegal
  3085.  0DEh    Maruitania
  3086.  0DFh    Mali
  3087.  0E0h    African Guinea
  3088.  0E1h    Ivory Coast
  3089.  0E2h    Burkina Faso
  3090.  0E3h    Niger
  3091.  0E4h    Togo
  3092.  0E5h    Benin
  3093.  0E6h    Mauritius
  3094.  0E7h    Liberia
  3095.  0E8h    Sierra Leone
  3096.  0E9h    Ghana
  3097.  0EAh    Nigeria
  3098.  0EBh    Chad
  3099.  0ECh    Centra African Republic
  3100.  0EDh    Cameroon
  3101.  0EEh    Cape Verde Islands
  3102.  0EFh    Sao Tome and Principe
  3103.  0F0h    Equatorial Guinea
  3104.  0F1h    Gabon
  3105.  0F2h    Congo
  3106.  0F3h    Zaire
  3107.  0F4h    Angola
  3108.  0F5h    Guinea-Bissau
  3109.  0F6h    Diego Garcia
  3110.  0F7h    Ascension Isle
  3111.  0F8h    Seychelles
  3112.  0F9h    Sudan
  3113.  0FAh    Rwhanda
  3114.  0FBh    Ethiopia
  3115.  0FCh    Somalia
  3116.  0FDh    Djibouti
  3117.  0FEh    Kenya
  3118.  0FFh    Tanzania
  3119.  100h    Uganda
  3120.  101h    Burundi
  3121.  103h    Mozambique
  3122.  104h    Zambia
  3123.  105h    Madagascar
  3124.  106h    Reunion Island
  3125.  107h    Zimbabwe
  3126.  108h    Namibia
  3127.  109h    Malawi
  3128.  10Ah    Lesotho
  3129.  10Bh    Botswana
  3130.  10Ch    Swaziland
  3131.  10Dh    Comoros
  3132.  10Eh    Mayotte
  3133.  122h    St. Helena
  3134.  129h    Aruba
  3135.  12Ah    Faroe Islands
  3136.  12Bh    Greenland
  3137.  15Eh    Gibraltar
  3138.  15Fh    Portugal
  3139.  160h    Luxembourg
  3140.  161h    Ireland
  3141.  162h    Iceland
  3142.  163h    Albania
  3143.  164h    Malta
  3144.  165h    Cyprus
  3145.  166h    Finland
  3146.  167h    Bulgaria
  3147.  172h    Lithuania
  3148.  173h    Latvia
  3149.  174h    Estonia
  3150.  175h    Moldova
  3151.  17Dh    Serbia / Montenegro
  3152.  181h    Croatia
  3153.  182h    Slovenia
  3154.  183h    Bosnia-Herzegovina (Latin)
  3155.  184h    Bosnia-Herzegovina (Cyrillic)
  3156.  185h    FYR Macedonia
  3157.  1A5h    Czech Republic
  3158.  1A6h    Slovakia
  3159.  1F4h    Falkland Islands
  3160.  1F5h    Belize
  3161.  1F6h    Guatemala
  3162.  1F7h    El Salvador
  3163.  1F8h    Honduras
  3164.  1F9h    Nicraragua
  3165.  1FAh    Costa Rica
  3166.  1FBh    Panama
  3167.  1FCh    St. Pierre and Miquelon
  3168.  1FDh    Haiti
  3169.  24Eh    Guadeloupe
  3170.  24Fh    Bolivia
  3171.  250h    Guyana
  3172.  251h    Ecuador
  3173.  252h    rench Guiana
  3174.  253h    Paraguay
  3175.  254h    Martinique / French Antilles
  3176.  255h    Suriname
  3177.  256h    Uruguay
  3178.  257h    Netherland Antilles
  3179.  29Eh    Saipan / N. Mariana Island
  3180.  29Fh    Guam
  3181.  2A0h    Norfolk Island (Australia) / Christmas Island/Cocos Islands / Antartica
  3182.  2A1h    Brunei Darussalam
  3183.  2A2h    Nauru
  3184.  2A3h    Papua New Guinea
  3185.  2A4h    Tonga Islands
  3186.  2A5h    Solomon Islands
  3187.  2A6h    Vanuatu
  3188.  2A7h    Fiji
  3189.  2A8h    Palau
  3190.  2A9h    Wallis & Futuna
  3191.  2AAh    Cook Islands
  3192.  2ABh    Niue
  3193.  2ACh    American Samoa
  3194.  2ADh    Western Samoa
  3195.  2AEh    Kiribati
  3196.  2AFh    New Caledonia
  3197.  2B0h    Tuvalu
  3198.  2B1h    French Polynesia
  3199.  2B2h    Tokealu
  3200.  2B3h    Micronesia
  3201.  2B4h    Marshall Islands
  3202.  311h    Arabic (Middle East/Saudi Arabia/etc.)
  3203.  324h    Ukraine
  3204.  329h    Antigua and Barbuda / Anguilla / Bahamas / Barbados / Bermuda
  3205.     British Virgin Islands / Cayman Islands / Dominica / Dominican Republ.
  3206.     Grenada / Jamaica / Montserra / St. Kitts and Nevis / St. Lucia
  3207.     St. Vincent and Grenadines / Trinidad and Tobago / Turks and Caicos
  3208.  352h    North Korea
  3209.  354h    Hong Kong
  3210.  355h    Macao
  3211.  357h    Cambodia
  3212.  358h    Laos
  3213.  370h    Bangladesh
  3214.  3C0h    Maldives
  3215.  3C1h    Lebanon
  3216.  3C2h    Jordan
  3217.  3C3h    Syrian Arab Republic
  3218.  3C4h    Ireq
  3219.  3C5h    Kuwait
  3220.  3C6h    Saudi Arabia
  3221.  3C7h    Yemen
  3222.  3C8h    Oman
  3223.  3CBh    United Arab Emirates
  3224.  3CCh    Israel (DR DOS 5.0,MS-DOS 5.0+)
  3225.  3CDh    Bahrain
  3226.  3CEh    Qatar
  3227.  3CFh    Bhutan
  3228.  3D0h    Mongolia
  3229.  3D1h    Nepal
  3230.  3E3h    Myanmar (Burma)
  3231. Note:    not all country codes are supported by all versions of DOS
  3232. --------D-2138--DXFFFF-----------------------
  3233. INT 21 - DOS 3.0+ - SET COUNTRY CODE
  3234.     AH = 38h
  3235.     DX = FFFFh
  3236.     AL = 01h thru FEh for specific country with code <255
  3237.     AL = FFh for specific country with code >= 255
  3238.        BX = 16-bit country code (see #0747)
  3239. Return: CF set on error
  3240.         AX = error code (see #1020 at AH=59h/BX=0000h)
  3241.     CF clear if successful
  3242. Note:    not supported by OS/2
  3243. SeeAlso: INT 2F/AX=1403h
  3244. --------D-2139-------------------------------
  3245. INT 21 - DOS 2+ - "MKDIR" - CREATE SUBDIRECTORY
  3246.     AH = 39h
  3247.     DS:DX -> ASCIZ pathname
  3248. Return: CF clear if successful
  3249.         AX destroyed
  3250.     CF set on error
  3251.         AX = error code (03h,05h) (see #1020 at AH=59h/BX=0000h)
  3252. Notes:    all directories in the given path except the last must exist
  3253.     fails if the parent directory is the root and is full
  3254.     DOS 2.x-3.3 allow the creation of a directory sufficiently deep that
  3255.       it is not possible to make that directory the current directory
  3256.       because the path would exceed 64 characters
  3257.     under the FlashTek X-32 DOS extender, the pointer is in DS:EDX
  3258. SeeAlso: AH=3Ah,AH=3Bh,AH=6Dh,AX=7139h,AH=E2h/SF=0Ah,INT 2F/AX=1103h
  3259. SeeAlso: INT 60/DI=0511h
  3260. --------D-213A-------------------------------
  3261. INT 21 - DOS 2+ - "RMDIR" - REMOVE SUBDIRECTORY
  3262.     AH = 3Ah
  3263.     DS:DX -> ASCIZ pathname of directory to be removed
  3264. Return: CF clear if successful
  3265.         AX destroyed
  3266.     CF set on error
  3267.         AX = error code (03h,05h,06h,10h) (see #1020 at AH=59h/BX=0000h)
  3268. Notes:    directory must be empty (contain only '.' and '..' entries)
  3269.     under the FlashTek X-32 DOS extender, the pointer is in DS:EDX
  3270. SeeAlso: AH=39h,AH=3Bh,AX=713Ah,AH=E2h/SF=0Bh,INT 2F/AX=1101h,INT 60/DI=0512h
  3271. --------D-213B-------------------------------
  3272. INT 21 - DOS 2+ - "CHDIR" - SET CURRENT DIRECTORY
  3273.     AH = 3Bh
  3274.     DS:DX -> ASCIZ pathname to become current directory (max 64 bytes)
  3275. Return: CF clear if successful
  3276.         AX destroyed
  3277.     CF set on error
  3278.         AX = error code (03h) (see #1020 at AH=59h/BX=0000h)
  3279. Notes:    if new directory name includes a drive letter, the default drive is
  3280.       not changed, only the current directory on that drive
  3281.     changing the current directory also changes the directory in which
  3282.       FCB file calls operate
  3283.     under the FlashTek X-32 DOS extender, the pointer is in DS:EDX
  3284. SeeAlso: AH=47h,AH=71h,INT 2F/AX=1105h
  3285. --------D-213C-------------------------------
  3286. INT 21 - DOS 2+ - "CREAT" - CREATE OR TRUNCATE FILE
  3287.     AH = 3Ch
  3288.     CX = file attributes (see #0748)
  3289.     DS:DX -> ASCIZ filename
  3290. Return: CF clear if successful
  3291.         AX = file handle
  3292.     CF set on error
  3293.         AX = error code (03h,04h,05h) (see #1020 at AH=59h/BX=0000h)
  3294. Notes:    if a file with the given name exists, it is truncated to zero length
  3295.     under the FlashTek X-32 DOS extender, the pointer is in DS:EDX
  3296.     DR DOS checks the system password or explicitly supplied password at
  3297.       the end of the filename against the reserved field in the directory
  3298.       entry before allowing access
  3299. SeeAlso: AH=16h,AH=3Dh,AH=5Ah,AH=5Bh,AH=93h,INT 2F/AX=1117h
  3300.  
  3301. Bitfields for file attributes:
  3302. Bit(s)    Description    (Table 0748)
  3303.  0    read-only
  3304.  1    hidden
  3305.  2    system
  3306.  3    volume label (ignored)
  3307.  4    reserved, must be zero (directory)
  3308.  5    archive bit
  3309.  7    if set, file is shareable under Novell NetWare
  3310. --------D-213D-------------------------------
  3311. INT 21 - DOS 2+ - "OPEN" - OPEN EXISTING FILE
  3312.     AH = 3Dh
  3313.     AL = access and sharing modes (see #0749)
  3314.     DS:DX -> ASCIZ filename
  3315.     CL = attribute mask of files to look for (server call only)
  3316. Return: CF clear if successful
  3317.         AX = file handle
  3318.     CF set on error
  3319.         AX = error code (01h,02h,03h,04h,05h,0Ch,56h) (see #1020 at AH=59h)
  3320. Notes:    file pointer is set to start of file
  3321.     file handles which are inherited from a parent also inherit sharing
  3322.       and access restrictions
  3323.     files may be opened even if given the hidden or system attributes
  3324.     under the FlashTek X-32 DOS extender, the pointer is in DS:EDX
  3325.     DR DOS checks the system password or explicitly supplied password at
  3326.       the end of the filename against the reserved field in the directory
  3327.       entry before allowing access
  3328.     sharing modes are only effective on local drives if SHARE is loaded
  3329. BUG:    Novell DOS 7 SHARE v1.00 would refuse file access in the cases in
  3330.       #0750 marked with [1] (read-only open of a read-only file
  3331.       which had previously been opened in compatibility mode); this was
  3332.       fixed in SHARE v1.01 of 09/29/94
  3333. SeeAlso: AH=0Fh,AH=3Ch,AX=4301h,AX=5D00h,INT 2F/AX=1116h,INT 2F/AX=1226h
  3334.  
  3335. Bitfields for access and sharing modes:
  3336. Bit(s)    Description    (Table 0749)
  3337.  2-0    access mode
  3338.     000 read only
  3339.     001 write only
  3340.     010 read/write
  3341.     011 (DOS 5+ internal) passed to redirector on EXEC to allow
  3342.         case-sensitive filenames
  3343.  3    reserved (0)
  3344.  6-4    sharing mode (DOS 3.0+) (see #0750)
  3345.     000 compatibility mode
  3346.     001 "DENYALL" prohibit both read and write access by others
  3347.     010 "DENYWRITE" prohibit write access by others
  3348.     011 "DENYREAD" prohibit read access by others
  3349.     100 "DENYNONE" allow full access by others
  3350.     111 network FCB (only available during server call)
  3351.  7    inheritance
  3352.     if set, file is private to current process and will not be inherited
  3353.       by child processes
  3354. SeeAlso: #1122
  3355.  
  3356. (Table 0750)
  3357. Values of DOS file sharing behavior:
  3358.       |    Second and subsequent Opens
  3359.  First      |Compat  Deny      Deny     Deny    Deny
  3360.  Open      |       All      Write     Read    None
  3361.       |R W RW R W RW R W RW R W RW R W RW
  3362.  - - - - -| - - - - - - - - - - - - - - - - -
  3363.  Compat R |Y Y Y  N N N     1 N N    N N N  1 N N
  3364.     W |Y Y Y  N N N     N N N    N N N  N N N
  3365.     RW|Y Y Y  N N N     N N N    N N N  N N N
  3366.  - - - - -|
  3367.  Deny    R |C C C  N N N     N N N    N N N  N N N
  3368.  All    W |C C C  N N N     N N N    N N N  N N N
  3369.     RW|C C C  N N N     N N N    N N N  N N N
  3370.  - - - - -|
  3371.  Deny    R |2 C C  N N N     Y N N    N N N  Y N N
  3372.  Write    W |C C C  N N N     N N N    Y N N  Y N N
  3373.     RW|C C C  N N N     N N N    N N N  Y N N
  3374.  - - - - -|
  3375.  Deny    R |C C C  N N N     N Y N    N N N  N Y N
  3376.  Read    W |C C C  N N N     N N N    N Y N  N Y N
  3377.     RW|C C C  N N N     N N N    N N N  N Y N
  3378.  - - - - -|
  3379.  Deny    R |2 C C  N N N     Y Y Y    N N N  Y Y Y
  3380.  None    W |C C C  N N N     N N N    Y Y Y  Y Y Y
  3381.     RW|C C C  N N N     N N N    N N N  Y Y Y
  3382. Legend: Y = open succeeds, N = open fails with error code 05h
  3383.     C = open fails, INT 24 generated
  3384.     1 = open succeeds if file read-only, else fails with error code
  3385.     2 = open succeeds if file read-only, else fails with INT 24
  3386. SeeAlso: #0977
  3387. --------v-213D76-----------------------------
  3388. INT 21 - VIRUS - "GT-SPOOF" -INSTALLATION CHECK
  3389.     AX = 3D76h
  3390. Return: AX = 763Dh if resident
  3391. SeeAlso: AX=357Fh,AX=3DFFh
  3392. --------v-213DFF-----------------------------
  3393. INT 21 - VIRUS - "JD-448" - INSTALLATION CHECK
  3394.     AX = 3DFFh
  3395. Return: AX = 4A44h if resident
  3396. SeeAlso: AX=3D76h,AX=4203h
  3397. --------D-213E-------------------------------
  3398. INT 21 - DOS 2+ - "CLOSE" - CLOSE FILE
  3399.     AH = 3Eh
  3400.     BX = file handle
  3401. Return: CF clear if successful
  3402.         AX destroyed
  3403.     CF set on error
  3404.         AX = error code (06h) (see #1020 at AH=59h/BX=0000h)
  3405. Notes:    if the file was written to, any pending disk writes are performed, the
  3406.       time and date stamps are set to the current time, and the directory
  3407.       entry is updated
  3408.     recent versions of DOS preserve AH because some versions of Multiplan
  3409.       had a bug which depended on AH being preserved
  3410. SeeAlso: AH=10h,AH=3Ch,AH=3Dh,INT 2F/AX=1106h,INT 2F/AX=1227h
  3411. --------D-213F-------------------------------
  3412. INT 21 - DOS 2+ - "READ" - READ FROM FILE OR DEVICE
  3413.     AH = 3Fh
  3414.     BX = file handle
  3415.     CX = number of bytes to read
  3416.     DS:DX -> buffer for data
  3417. Return: CF clear if successful
  3418.         AX = number of bytes actually read (0 if at EOF before call)
  3419.     CF set on error
  3420.         AX = error code (05h,06h) (see #1020 at AH=59h/BX=0000h)
  3421. Notes:    data is read beginning at current file position, and the file position
  3422.       is updated after a successful read
  3423.     the returned AX may be smaller than the request in CX if a partial
  3424.       read occurred
  3425.     if reading from CON, read stops at first CR
  3426.     under the FlashTek X-32 DOS extender, the pointer is in DS:EDX
  3427. BUG:    Novell NETX.EXE v3.26 and 3.31 do not set CF if the read fails due to
  3428.       a record lock (see AH=5Ch), though it does return AX=0005h; this
  3429.       has been documented by Novell
  3430. SeeAlso: AH=27h,AH=40h,AH=93h,INT 2F/AX=1108h,INT 2F/AX=1229h
  3431. --------G-213F-------------------------------
  3432. INT 21 - Turbo Debug HARDWARE BREAKPOINTS - READ STATUS BLOCK
  3433.     AH = 3Fh
  3434.     BX = handle for character device "TDHDEBUG"
  3435.     CX = number of bytes to read
  3436.     DS:DX -> buffer for status block (see #0752)
  3437. Return: CF clear if successful
  3438.         AX = number of bytes actually read
  3439.     CF set on error
  3440.         AX = error code (05h,06h) (see #1020 at AH=59h/BX=0000h)
  3441. SeeAlso: AH=40h"Turbo Debug"
  3442.  
  3443. (Table 0751)
  3444. Values for status of Turbo Debugger command:
  3445.  00h    successful
  3446.  01h    invalid handle
  3447.  02h    no more breakpoints available
  3448.  03h    hardware does not support specified breakpoint type
  3449.  04h    previous command prevents execution
  3450.  05h    debugger hardware not found
  3451.  06h    hardware failure
  3452.  07h    invalid command
  3453.  08h    driver not initialized yet
  3454.  FEh    recursive entry (hardware breakpoint inside hw bp handler)
  3455.  
  3456. Format of Turbo Debugger status block:
  3457. Offset    Size    Description    (Table 0752)
  3458.  00h    BYTE    status of command (see #0751)
  3459. ---status for command 01h---
  3460.  01h    WORD    device driver interface version number (currently 1)
  3461.  03h    WORD    device driver software version
  3462.  05h    BYTE    maximum simultaneous hardware breakpoints
  3463.  06h    BYTE    configuration bits (see #0753)
  3464.  07h    BYTE    supported breakpoint types (see #0754)
  3465.  08h    WORD    supported addressing match modes (see #0755)
  3466.  0Ah    WORD    supported data matches (see #0756)
  3467.  0Ch    BYTE    maximum data match length (01h, 02h, or 04h)
  3468.  0Dh    WORD    size of onboard memory (in KB)
  3469.  0Fh    WORD    maximum number of trace-back events
  3470.  11h    WORD    hardware breakpoint enable byte address segment (0000h if not
  3471.           supported)
  3472. ---status for command 04h---
  3473.  01h    BYTE    handle to use when referring to the just-set breakpoint
  3474.  
  3475. Bitfields for Turbo Debugger configuration bits:
  3476. Bit(s)    Description    (Table 0753)
  3477.  0    CPU and DMA accesses are distinct
  3478.  1    can detect DMA transfers
  3479.  2    supports data mask
  3480.  3    hardware pass counter on breakpoints
  3481.  4    can match on data as well as addresses
  3482.  
  3483. Bitfields for Turbo Debugger supported breakpoint types:
  3484. Bit(s)    Description    (Table 0754)
  3485.  0    memory read
  3486.  1    memory write
  3487.  2    memory read/write
  3488.  3    I/O read
  3489.  4    I/O write
  3490.  5    I/O read/write
  3491.  6    instruction fetch
  3492.  
  3493. Bitfields for Turbo Debugger supported addressing match modes:
  3494. Bit(s)    Description    (Table 0755)
  3495.  0    any address
  3496.  1    equal to test value
  3497.  2    not equal
  3498.  3    above test value
  3499.  4    below test value
  3500.  5    below or equal
  3501.  6    above or equal
  3502.  7    within range
  3503.  8    outside range
  3504.  
  3505. Bitfields for Turbo Debugger supported data matches:
  3506. Bit(s)    Description    (Table 0756)
  3507.  0    any data
  3508.  1    equal to test value
  3509.  2    not equal
  3510.  3    above test value
  3511.  4    below test value
  3512.  5    below or equal
  3513.  6    above or equal
  3514.  7    within range
  3515.  8    outside range
  3516. --------N-213F-------------------------------
  3517. INT 21 - PC/TCP IPCUST.SYS - READ CONFIGURATION DATA
  3518.     AH = 3Fh
  3519.     BX = handle for character device "$IPCUST"
  3520.     CX = number of bytes to read
  3521.     DS:DX -> buffer for configuration data (see #0757)
  3522. Return: CF clear if successful
  3523.         AX = number of bytes actually read
  3524.     CF set on error
  3525.         AX = error code (05h,06h) (see #1020 at AH=59h/BX=0000h)
  3526. Notes:    if less than the entire data is read or written, the next read/write
  3527.       continues where the previous one ended; IOCTL calls AX=4402h and
  3528.       AX=4403h both reset the location at which the next operation starts
  3529.       to zero
  3530.     the data pointer is also reset to zero if the previous read or write
  3531.       reached or exceeded the end of the data, when the current function
  3532.       is read and the previous was write, or vice versa
  3533.     v2.1+ uses a new configuration method, but allows the installation
  3534.       of IPCUST.SYS for backward compatibility with other software which
  3535.       must read the PC/TCP configuration
  3536. SeeAlso: AH=40h"IPCUST",AX=4402h"IPCUST",AX=4402h"FTPSOFT"
  3537.  
  3538. Format of PC/TCP configuration data:
  3539. Offset    Size    Description    (Table 0757)
  3540.  00h 12 BYTEs    IPCUST.SYS device driver header (see #0987)
  3541.  12h    BYTE    ???
  3542.  13h    BYTE    ???
  3543.  14h    WORD    ???
  3544.  16h    BYTE    bit flags
  3545.         bit 0: send BS rather than DEL for BackSpace key
  3546.         bit 1: wrap long lines
  3547.  17h    BYTE    ???
  3548.  18h 64 BYTEs    ASCIZ hostname
  3549.  58h 64 BYTEs    ASCIZ domain name
  3550.         (fully qualified domain name is hostname.domain-name)
  3551.  98h 16 BYTEs    ASCIZ username
  3552.  A8h 64 BYTEs    ASCIZ full name
  3553.  E8h 64 BYTEs    ASCIZ office address
  3554. 128h 32 BYTEs    ASCIZ phone number
  3555. 148h    WORD    offset from GMT in minutes
  3556. 14Ah  4 BYTEs    ASCIZ timezone name
  3557. 14Eh    WORD    number of time servers
  3558. 150h  ? DWORDs    (big-endian) IP addresses for time servers
  3559.     ???
  3560. 164h    WORD    number of old-style name servers
  3561. 166h  3 DWORDs    (big-endian) IP addresses for name servers
  3562. 172h    WORD    number of domain name servers
  3563. 174h  3 DWORDs    (big-endian) IP addresses for domain name servers
  3564. 180h    DWORD    (big-endian) IP address of default gateway
  3565. 184h    DWORD    (big-endian) IP address of log server
  3566. 188h    DWORD    (big-endian) IP address of cookie server
  3567. 18Ch    DWORD    (big-endian) IP address of lpr server
  3568. 190h    DWORD    (big-endian) IP address of imagen print server
  3569. 194h 54 BYTEs    ???
  3570. 1E8h    WORD    TCP default window size in bytes
  3571. 1EAh    WORD    TCP low window size
  3572. 1ECh 64 BYTEs    ASCIZ host tabel filename
  3573. 22Ch  2 BYTEs    ???
  3574. 22Eh 80 BYTEs    ASCIZ mail relay host name
  3575. 27Eh    BYTE    ???
  3576. 27Fh    BYTE    ??? bit flags
  3577. 280h 44 BYTEs    ???
  3578. 2ACh    WORD    ???
  3579. 2AEh 202 BYTEs    ???
  3580. --------N-213F-------------------------------
  3581. INT 21 - WORKGRP.SYS - GET ENTRY POINT
  3582.     AH = 3Fh
  3583.     BX = file handle for device "NET$HLP$"
  3584.     CX = 0008h
  3585.     DS:DX -> buffer for entry point record (see #0827)
  3586. Return: CF clear if successful
  3587.         AX = number of bytes actually read (0 if at EOF before call)
  3588.     CF set on error
  3589.         AX = error code (05h,06h) (see #1020 at AH=59h/BX=0000h)
  3590. Program: WORKGRP.SYS is the portion of Microsoft's Workgroup Connection which
  3591.       permits communication with PCs running Windows for Workgroups or
  3592.       LAN Manager
  3593. SeeAlso: AX=4402h"WORKGRP.SYS",INT 2F/AX=9400h
  3594. --------N-213F-------------------------------
  3595. INT 21 - BW-TCP - GET DRIVER INFO
  3596.     AH = 3Fh
  3597.     BX = file handle for device "ETHDEV27"
  3598.     CX = 002Bh
  3599.     DS:DX -> buffer for driver info (see #0758)
  3600. Return: CF clear if successful
  3601.         AX = number of bytes actually read (0 if at EOF before call)
  3602.     CF set on error
  3603.         AX = error code (05h,06h) (see #1020 at AH=59h/BX=0000h)
  3604. Program: BW-TCP is a TCP/IP protocol stack by Beame & Whiteside Software
  3605. Notes:    the B&W socket library performs an INT 21/AX=4401h with DX=0060h before
  3606.       making this call to retrieve the driver information; one should also
  3607.       call the private API interrupt with AH=15h
  3608.     the installation check for the TCP/IP stack is to test for the
  3609.       existence of the character device UDP-IP10
  3610. SeeAlso: INT 14/AH=56h,INT 62/AH=00h"ETHDEV",INT 63/AH=03h,INT 64/AH=01h
  3611. Index:    installation check;BW-TCP hardware driver
  3612. Index:    installation check;BW-TCP TCPIP.SYS
  3613.  
  3614. Format of BW-TCP driver info:
  3615. Offset    Size    Description    (Table 0758)
  3616.  00h    WORD    I/O base address
  3617.  02h    BYTE    shared memory page (01h = segment 0100h, etc.)
  3618.  03h    BYTE    interrupt vector for private API
  3619.  04h    BYTE    IRQ used by board
  3620.  05h    WORD    size of data buffer
  3621.  07h    WORD    maximum transfer window
  3622.  09h    WORD    time zone
  3623.  0Bh    BYTE    address type (01h user, 04h RARP, 05h BOOTP)
  3624.  0Ch    DWORD    internet address
  3625.  10h    WORD    "value" ???
  3626.  12h    BYTE    subnet mask
  3627.  13h    WORD    "ether_pointer" ???
  3628.  15h    WORD    offset in device driver of log server records (see #0759)
  3629.  17h    WORD    offset in device driver of name server records (see #0759)
  3630.  19h    WORD    offset in device driver of print server records (see #0759)
  3631.  1Bh    WORD    offset in device driver of time server records (see #0759)
  3632.  1Dh    WORD    offset in device driver of gateway records (see #0759)
  3633.  1Fh    WORD    segment address of device driver
  3634.  21h    BYTE    transfer size
  3635.  22h  9 BYTEs    network adapter board name
  3636. ---11/21/91+ ---
  3637.  23h    BYTE    ETHDEV version (major in high nybble, minor in low nybble)
  3638.  24h    BYTE    ETHDEV revision
  3639.  25h    BYTE    TCPIP version (major in high nybble, minor in low nybble)
  3640.  26h    BYTE    TCPIP revision
  3641.  27h    BYTE    BWRPC version (major in high nybble, minor in low nybble)
  3642.  28h    BYTE    BWRPC revision
  3643.  29h    BYTE    BWNFS version (major in high nybble, minor in low nybble)
  3644.  2Ah    BYTE    BWNFS revision
  3645.  2Bh    BYTE    Telnet version (major in high nybble, minor in low nybble)
  3646.  2Ch    BYTE    Telnet revision
  3647.  2Dh    BYTE    NETBIOS version (major in high nybble, minor in low nybble)
  3648.  2Eh    BYTE    NETBIOS revision
  3649. Note:    for each driver, if version=0, the driver is not installed or does
  3650.       not support the version check
  3651.  
  3652. Format of BW-TCP server records:
  3653. Offset    Size    Description    (Table 0759)
  3654.  00h    BYTE    number of server records following
  3655.  01h  N DWORDs    internet addresses of servers
  3656. --------y-213F-------------------------------
  3657. INT 21 - Trusted Access - NB.SYS - GET STATE
  3658.     AH = 3Fh
  3659.     BX = file handle for device "$$NB$$NB"
  3660.     CX = 0002h (size of state)
  3661.     DS:DX -> buffer for state record (see #0760)
  3662. Return: CF clear if successful
  3663.         AX = number of bytes actually read (0 if at EOF before call)
  3664.     CF set on error
  3665.         AX = error code (05h,06h) (see #1020 at AH=59h/BX=0000h)
  3666. Program: Trusted Access is a security and access-control package by Lassen
  3667.       Software, Inc.; NB.SYS is a device driver to prevent the user from
  3668.       terminating CONFIG.SYS or AUTOEXEC.BAT with Ctrl-Break
  3669. SeeAlso: AH=40h"NB.SYS",AX=4101h
  3670.  
  3671. Format of Trusted Access state record:
  3672. Offset    Size    Description    (Table 0760)
  3673.  00h    BYTE    00h off, 01h on
  3674.  01h    BYTE    keys being disabled
  3675.         bit 0: Ctrl-Break
  3676.         bit 1: SysReq
  3677.         bit 2: Ctrl and Alt
  3678.         bit 3: Ctrl-Alt-Del
  3679.         bit 7: all keys (overrides other bits)
  3680. ----------213F-------------------------------
  3681. INT 21 U - IFSHLP.SYS - GET ENTRY POINT
  3682.     AH = 3Fh
  3683.     BX = file handle for device "IFS$HLP$"
  3684.     CX = 0008h (size of buffer in bytes)
  3685.     DS:DX -> buffer for entry point record (see #0761)
  3686. Return: CF clear if successful
  3687.         AX = number of bytes actually read (0 if at EOF before call)
  3688.     CF set on error
  3689.         AX = error code (05h,06h) (see #1020 at AH=59h/BX=0000h)
  3690. Program: IFSHLP.SYS is a support driver for Microsoft Windows for Workgroups
  3691. SeeAlso: AX=4402h"IFSHLP"
  3692.  
  3693. Format of IFSHLP.SYS entry point record:
  3694. Offset    Size    Description    (Table 0761)
  3695.  00h  4 BYTEs    (call) required signature if called via IOCTL
  3696.             70h E9h 34h 37h for Windows 3.11
  3697.             70h E9h 35h 37h for Windows 3.11
  3698.         (ret) signature 34h 37h 70h EFh (Windows 3.11)
  3699.         (ret) signature 35h 37h 70h EFh (Windows95)
  3700.  04h    DWORD    (ret) pointer to FAR call entry point (see #0762)
  3701.  
  3702. (Table 0762)
  3703. Call IFSHLP.SYS entry point with:
  3704.     STACK:    WORD    function number (00h-0Ch)
  3705.             00h get ??? data
  3706.             01h set interrupt intercepts (trap)
  3707.             02h remove interrupt intercepts (untrap)
  3708.             03h ??? LPT2
  3709.             04h ??? LPT1
  3710.             05h revector INT 2F to trap and remove trap for others
  3711.             06h set ??? flag
  3712.             07h clear ??? flag
  3713.             08h get ??? flag word
  3714.             ---Windows 3.11 only---
  3715.             09h ???
  3716.             0Ah ???
  3717.             0Bh ???
  3718.             0Ch get ???
  3719. ---if function 00h---
  3720. Return: DX:AX -> ??? data (see #3453)
  3721.     BX destroyed
  3722. ---if function 01h---
  3723.     STACK:    DWORD    new intercept (trap) address
  3724. Return: AX = status
  3725.         0000h successful
  3726.         0001h failed (already set)
  3727.         DX = 0000h
  3728.     BX destroyed
  3729. Note:    the trap handler is called with a function number in BX, and the
  3730.       original BX on top of the stack; a null handler must perform a
  3731.       POP BX and an IRET
  3732. ---if function 02h---
  3733. Return: AX = status
  3734.         0000h successful
  3735.         0001h failed (not set)
  3736.     DX = 0000h
  3737.     BX destroyed
  3738. ---if function 03h,04h---
  3739.     STACK:    WORD    ???
  3740. Return: AX = 0000h
  3741.     DX = 0000h
  3742.     BX destroyed
  3743. ---if function 05h---
  3744.     ???
  3745. Return:    BX destroyed
  3746. ---if function 06h---
  3747. Return: AX = 0001h and DX = 0000h if already set
  3748.     AX,DX unchanged if successful
  3749.     BX destroyed
  3750. ---if function 07h---
  3751. Return: AX = 0001h and DX = 0000h if not set
  3752.     AX,DX unchanged if successful
  3753.     BX destroyed
  3754. ---if function 08h---
  3755. Return: DX = 0000h
  3756.     AX = flags
  3757.         bit 0: set/cleared by functions 06h and 07h
  3758.         bit 1: trap is currently set (refer to functions 01h/02h)
  3759.     BX destroyed
  3760. ---if function 09h---
  3761. Return: AX = status
  3762.         0000h successful
  3763.         0001h failed (already called)
  3764.     BX destroyed
  3765. ---if function 0Ah---
  3766.     STACK:    WORD    ???
  3767.     ???
  3768. Return:    BX destroyed
  3769. ---if function 0Bh---
  3770. Return: AX = status
  3771.         0000h successful
  3772.         0001h failed (not set)
  3773.     BX destroyed
  3774. ---if function 0Ch---
  3775. Return: AX = 0000h
  3776.     ES:BX -> ??? data
  3777. ---if function > 0Ch---
  3778. Return: AX = 0001h
  3779.     DX = 0000h
  3780.     BX destroyed
  3781.  
  3782. Format of IFSHLP ??? data:
  3783. Offset    Size    Description    (Table 3453)
  3784.  00h    DWORD    -> DOS Swappable Data Area (see #1027,#1029)
  3785.  02h    WORD    ??? offset in DOS data segment?
  3786.  04h    WORD    offset in DOS data segment of current-PSP WORD
  3787.  06h    WORD    ???
  3788.  08h    WORD    ???
  3789.  0Ah    WORD    ???
  3790.  0Ch    DWORD    -> DOS List of Lists (see #0968)
  3791.  10h    ???
  3792. SeeAlso: #0762
  3793. --------v-213F--BXFEB0-----------------------
  3794. INT 21 - VIRUS - "KYZ/LieWait" - INSTALLATION CHECK
  3795.     AH = 3Fh
  3796.     BX = FEB0h
  3797. Return: BX = 1212h if resident
  3798. SeeAlso: AX=3032h"VIRUS",AX=4BF1h"VIRUS"
  3799. --------D-2140-------------------------------
  3800. INT 21 - DOS 2+ - "WRITE" - WRITE TO FILE OR DEVICE
  3801.     AH = 40h
  3802.     BX = file handle
  3803.     CX = number of bytes to write
  3804.     DS:DX -> data to write
  3805. Return: CF clear if successful
  3806.         AX = number of bytes actually written
  3807.     CF set on error
  3808.         AX = error code (05h,06h) (see #1020 at AH=59h/BX=0000h)
  3809. Notes:    if CX is zero, no data is written, and the file is truncated or
  3810.       extended to the current position
  3811.     data is written beginning at the current file position, and the file
  3812.       position is updated after a successful write
  3813.     for FAT32 drives, the file must have been opened with AX=6C00h with
  3814.       the "extended size" flag in order to expand the file beyond 2GB;
  3815.       otherwise the write will fail with error code 0005h (access denied)
  3816.     the usual cause for AX < CX on return is a full disk
  3817. BUG:    a write of zero bytes will appear to succeed when it actually failed
  3818.       if the write is extending the file and there is not enough disk
  3819.       space for the expanded file (DOS 5.0-6.0); one should therefore check
  3820.       whether the file was in fact extended by seeking to 0 bytes from
  3821.       the end of the file (INT 21/AX=4202h/CX=0/DX=0)
  3822.     under the FlashTek X-32 DOS extender, the pointer is in DS:EDX
  3823. SeeAlso: AH=28h,AH=3Fh"DOS",AH=93h,INT 2F/AX=1109h
  3824. --------G-2140-------------------------------
  3825. INT 21 - Turbo Debug HARDWARE BREAKPOINTS - SEND CMD TO HARDWARE BRKPNT DRIVER
  3826.     AH = 40h
  3827.     BX = handle for character device "TDHDEBUG"
  3828.     CX = number of bytes to write
  3829.     DS:DX -> hardware breakpoint command (see #0763)
  3830. Return: CF clear if successful
  3831.         AX = number of bytes actually written
  3832.     CF set on error
  3833.         AX = error code (05h,06h) (see #1020 at AH=59h/BX=0000h)
  3834. Note:    results are retrieved by reading from the device
  3835. SeeAlso: AH=3Fh"Turbo Debug"
  3836.  
  3837. Format of Turbo Debugger hardware breakpoint commands:
  3838. Offset    Size    Description    (Table 0763)
  3839.  00h    BYTE    command code
  3840.         00h install interrupt vectors
  3841.         01h get hardware capabilities
  3842.         02h enable hardware breakpoints
  3843.         03h disable hardware breakpoints
  3844.         04h set hardware breakpoint
  3845.         05h clear hardware breakpoint
  3846.         06h set I/O base address and reset hardware
  3847.         07h restore interrupt vectors
  3848. ---command code 00h---
  3849.  01h    DWORD    pointer to Turbo Debugger entry point to be jumped to on
  3850.           hardware breakpoint; call with CPU state the same as on
  3851.           the breakpoint except for pushing AX and placing an entry
  3852.           code (FFh if breakout button or breakpoint handle) in AH
  3853. ---command code 04h---
  3854.  01h    BYTE    breakpoint type
  3855.         00h memory read
  3856.         01h memory write
  3857.         02h memory read/write
  3858.         03h I/O read
  3859.         04h I/O write
  3860.         05h I/O read/write
  3861.         06h instruction fetch
  3862.  02h    BYTE    address matching mode (see #0764)
  3863.  03h    DWORD    32-bit linear low address
  3864.  07h    DWORD    32-bit linear high address
  3865.  0Bh    WORD    pass count
  3866.  0Dh    BYTE    data size (01h, 02h, or 04h)
  3867.  0Eh    BYTE    source of matched bus cycle (01h CPU, 02h DMA, 03h either)
  3868.  0Fh    BYTE    data-matching mode (see #0764)
  3869.  10h    DWORD    low data value
  3870.  14h    DWORD    high data value
  3871.  18h    DWORD    data mask specifying which bits of the data are tested
  3872. ---command code 05h---
  3873.  01h    BYTE    handle of breakpoint to clear (breakpoint returned from command
  3874.           04h)
  3875. ---command code 06h---
  3876.  01h    WORD    base address of hardware debugger board
  3877.  
  3878. (Table 0764)
  3879. Values for Turbo Debugger address/data matching mode:
  3880.  00h    match any
  3881.  01h    equal to test value
  3882.  02h    different from test value
  3883.  03h    above test value
  3884.  04h    below test value
  3885.  05h    below or equal to test value
  3886.  06h    above or equal to test value
  3887.  07h    within inclusive range
  3888.  08h    outside specified range
  3889. --------N-2140-------------------------------
  3890. INT 21 - PC/TCP IPCUST.SYS - WRITE CONFIGURATION DATA
  3891.     AH = 40h
  3892.     BX = handle for character device "$IPCUST"
  3893.     CX = number of bytes to write
  3894.     DS:DX -> buffer for configuration data (AH=3Fh"IPCUST")
  3895. Return: CF clear if successful
  3896.         AX = number of bytes actually written
  3897.     CF set on error
  3898.         AX = error code (05h,06h) (see #1020 at AH=59h/BX=0000h)
  3899. Notes:    if less than the entire data is read or written, the next read/write
  3900.       continues where the previous one ended; IOCTL calls AX=4402h and
  3901.       AX=4403h both reset the location at which the next operation starts
  3902.       to zero
  3903.     the data pointer is also reset to zero if the previous read or write
  3904.       reached or exceeded the end of the data, when the current function
  3905.       is read and the previous was write, or vice versa
  3906.     v2.1+ uses a new configuration method, but allows the installation
  3907.       of IPCUST.SYS for backward compatibility with other software which
  3908.       must read the PC/TCP configuration
  3909. SeeAlso: AH=3Fh"IPCUST",AX=4402h"IPCUST"
  3910. --------y-2140-------------------------------
  3911. INT 21 U - Trusted Access - NB.SYS - SET STATE
  3912.     AH = 40h
  3913.     BX = handle for character device "$$NB$$NB"
  3914.     DS:DX -> state record (see #0760)
  3915.     CX ignored
  3916. Return: CF clear if successful
  3917.         AX = number of bytes actually written
  3918.     CF set on error
  3919.         AX = error code (05h,06h) (see #1020 at AH=59h/BX=0000h)
  3920. Program: Trusted Access is a security and access-control package by Lassen
  3921.       Software, Inc.; NB.SYS is a device driver to prevent the user from
  3922.       terminating CONFIG.SYS or AUTOEXEC.BAT with Ctrl-Break
  3923. SeeAlso: AH=3Fh"NB.SYS"
  3924. --------j-214000BX0002-----------------------
  3925. INT 21 - FARTBELL.EXE - INSTALLATION CHECK
  3926.     AX = 4000h
  3927.     BX = 0002h
  3928.     CX = 0000h
  3929.     DS:DX = 0000h:0000h
  3930. Return: CF clear if installed
  3931.         AX = CS of resident code
  3932. Program: FARTBELL is a joke program by Guenther Thiele which makes various
  3933.       noises when programs output a bell
  3934. SeeAlso: AX=4001h
  3935. --------j-214001BX0002-----------------------
  3936. INT 21 - FARTBELL.EXE - FORCE NOISE
  3937.     AX = 4001h
  3938.     BX = 0002h
  3939.     CX = 0000h
  3940.     DS:DX = 0000h:0000h
  3941. Program: FARTBELL is a joke program by Guenther Thiele which makes various
  3942.       noises when programs output a bell
  3943. SeeAlso: AX=4000h
  3944. --------D-2141-------------------------------
  3945. INT 21 - DOS 2+ - "UNLINK" - DELETE FILE
  3946.     AH = 41h
  3947.     DS:DX -> ASCIZ filename (no wildcards, but see notes)
  3948.     CL = attribute mask for deletion (server call only, see notes)
  3949. Return: CF clear if successful
  3950.         AX destroyed (DOS 3.3) AL seems to be drive of deleted file
  3951.     CF set on error
  3952.         AX = error code (02h,03h,05h) (see #1020 at AH=59h/BX=0000h)
  3953. Notes:    (DOS 3.1+) wildcards are allowed if invoked via AX=5D00h, in which case
  3954.       the filespec must be canonical (as returned by AH=60h), and only
  3955.       files matching the attribute mask in CL are deleted
  3956.     DR DOS 5.0-6.0 returns error code 03h if invoked via AX=5D00h; DR DOS
  3957.       3.41 crashes if called via AX=5D00h with wildcards
  3958.     DOS does not erase the file's data; it merely becomes inaccessible
  3959.       because the FAT chain for the file is cleared
  3960.     deleting a file which is currently open may lead to filesystem
  3961.       corruption.  Unless SHARE is loaded, DOS does not close the handles
  3962.       referencing the deleted file, thus allowing writes to a nonexistant
  3963.       file.
  3964.     under DR DOS and DR Multiuser DOS, this function will fail if the file
  3965.       is currently open
  3966.     under the FlashTek X-32 DOS extender, the pointer is in DS:EDX
  3967. BUG:    DR DOS 3.41 crashes if called via AX=5D00h
  3968. SeeAlso: AH=13h,AX=4301h,AX=4380h,AX=5D00h,AH=60h,AH=71h,AX=F244h
  3969. SeeAlso: INT 2F/AX=1113h
  3970. --------y-214101DXFFFE-----------------------
  3971. INT 21 - SoftLogic Data Guardian - ???
  3972.     AX = 4101h
  3973.     DX = FFFEh
  3974. Return: AX = 0000h if installed
  3975. Note:    resident code sets several internal variables on this call
  3976. SeeAlso: AH=3Fh"NB.SYS",INT 16/AX=FFA3h/BX=0000h
  3977. --------D-2142-------------------------------
  3978. INT 21 - DOS 2+ - "LSEEK" - SET CURRENT FILE POSITION
  3979.     AH = 42h
  3980.     AL = origin of move
  3981.         00h start of file
  3982.         01h current file position
  3983.         02h end of file
  3984.     BX = file handle
  3985.     CX:DX = offset from origin of new file position
  3986. Return: CF clear if successful
  3987.         DX:AX = new file position in bytes from start of file
  3988.     CF set on error
  3989.         AX = error code (01h,06h) (see #1020 at AH=59h/BX=0000h)
  3990. Notes:    for origins 01h and 02h, the pointer may be positioned before the
  3991.       start of the file; no error is returned in that case, but subsequent
  3992.       attempts at I/O will produce errors
  3993.     if the new position is beyond the current end of file, the file will
  3994.       be extended by the next write (see AH=40h); for FAT32 drives, the
  3995.       file must have been opened with AX=6C00h with the "extended size"
  3996.       flag in order to expand the file beyond 2GB
  3997. BUG:    using this method to grow a file from zero bytes to a very large size
  3998.       can corrupt the FAT in some versions of DOS; the file should first
  3999.       be grown from zero to one byte and then to the desired large size
  4000. SeeAlso: AH=24h,INT 2F/AX=1228h
  4001. --------v-214203-----------------------------
  4002. INT 21 - VIRUS - "Shake" - INSTALLATION CHECK
  4003.     AX = 4203h
  4004. Return: AX = 1234h if resident
  4005. SeeAlso: AX=3DFFh,AX=4243h
  4006. --------v-214243-----------------------------
  4007. INT 21 - VIRUS - "Invader" - INSTALLATION CHECK
  4008.     AX = 4243h
  4009. Return: AX = 5678h if resident
  4010. SeeAlso: AX=4203h,AX=44A0h,AX=4B04h
  4011. --------D-214300-----------------------------
  4012. INT 21 - DOS 2+ - GET FILE ATTRIBUTES
  4013.     AX = 4300h
  4014.     DS:DX -> ASCIZ filename
  4015. Return: CF clear if successful
  4016.         CX = file attributes (see #0765)
  4017.         AX = CX (DR DOS 5.0)
  4018.     CF set on error
  4019.         AX = error code (01h,02h,03h,05h) (see #1020 at AH=59h)
  4020. Notes:    under the FlashTek X-32 DOS extender, the filename pointer is in DS:EDX
  4021.     under DR DOS 3.41 and 5.0, attempts to change the subdirectory bit are
  4022.       simply ignored without an error
  4023. BUG:    Windows for Workgroups returns error code 05h (access denied) instead
  4024.       of error code 02h (file not found) when attempting to get the
  4025.       attributes of a nonexistent file.  This causes open() with O_CREAT
  4026.       and fopen() with the "w" mode to fail in Borland C++.
  4027. SeeAlso: AX=4301h,AX=4310h,AX=7143h,AH=B6h,INT 2F/AX=110Fh,INT 60/DI=0517h
  4028. --------D-214301-----------------------------
  4029. INT 21 - DOS 2+ - "CHMOD" - SET FILE ATTRIBUTES
  4030.     AX = 4301h
  4031.     CX = new file attributes (see #0765)
  4032.     DS:DX -> ASCIZ filename
  4033. Return: CF clear if successful
  4034.         AX destroyed
  4035.     CF set on error
  4036.         AX = error code (01h,02h,03h,05h) (see #1020 at AH=59h)
  4037. Notes:    will not change volume label or directory attribute bits, but will
  4038.       change the other attribute bits of a directory (the directory
  4039.       bit must be cleared to successfully change the other attributes of a
  4040.       directory, but the directory will not be changed to a normal file as
  4041.       a result)
  4042.     MS-DOS 4.01 reportedly closes the file if it is currently open
  4043.     for security reasons, the Novell NetWare execute-only bit can never
  4044.       be cleared; the file must be deleted and recreated
  4045.     under the FlashTek X-32 DOS extender, the filename pointer is in DS:EDX
  4046.     DOS 5.0 SHARE will close the file if it is currently open in sharing-
  4047.       compatibility mode, otherwise a sharing violation critical error is
  4048.       generated if the file is currently open
  4049.     DR DOS 3.41/5.0 will silently ignore attempts to change the 'directory'
  4050.       attribute bit
  4051. SeeAlso: AX=4300h,AX=4311h,AX=7143h,INT 2F/AX=110Eh
  4052.  
  4053. Bitfields for file attributes:
  4054. Bit(s)    Description    (Table 0765)
  4055.  7    shareable (Novell NetWare)
  4056.  6    unused
  4057.  5    archive
  4058.  4    directory
  4059.  3    volume label
  4060.     execute-only (Novell NetWare)
  4061.  2    system
  4062.  1    hidden
  4063.  0    read-only
  4064. --------D-214302-----------------------------
  4065. INT 21 - DOS 7 - GET COMPRESSED FILE SIZE
  4066.     AX = 4302h
  4067.     DS:DX -> ASCIZ pathname for file or directory
  4068. Return: CF clear if successful
  4069.         ??? = compressed size of file/directory in bytes
  4070.     CF set on error
  4071.         AX = error code
  4072. Note:    on volumes which do not support compression, the returned size is the
  4073.       actual file size rounded up to the next cluster boundary
  4074. SeeAlso: AH=71h,AH=72h
  4075. --------O-214302-----------------------------
  4076. INT 21 - DR DOS 3.41+ internal - GET ACCESS RIGHTS
  4077.     AX = 4302h
  4078.     DS:DX -> ASCIZ pathname
  4079. Return: CF clear if successful
  4080.         CX = access rights (see #0766)
  4081.         AX = CX (DR DOS 5.0)
  4082.     CF set on error
  4083.         AX = error code
  4084. Desc:    Determine which operations the calling program may perform on a
  4085.       specified file without being required to provide a password.
  4086. Notes:    this protection scheme has been coordinated on all current Digital
  4087.       Research/Novell operating systems (DR DOS 3.41+, DRMDOS 5.x, and
  4088.       FlexOS 2+)
  4089.     this function is documented in DR DOS 6.0 and corresponds to the
  4090.       "Get/Set File Attributes" function, subfunction 2, documented in
  4091.       Concurrent DOS.
  4092.     only FlexOS actually uses the "execution" bits; DR DOS 3.41+ treats
  4093.       them as "read" bits.
  4094.     DR DOS 3.41-5.x only use bits 0-3.  Only DR DOS 6.0 using a
  4095.       DRMDOS 5.x security system allowing for users and groups uses bits
  4096.       4-11.
  4097. SeeAlso: AX=4303h
  4098.  
  4099. Bitfields for DR DOS file access rights:
  4100. Bit(s)    Description    (Table 0766)
  4101.  0    owner delete requires password
  4102.  1    owner execution requires password (FlexOS)
  4103.  2    owner write requires password
  4104.  3    owner read requires password
  4105.  4    group delete requires password
  4106.  5    group execution requires password (FlexOS)
  4107.  6    group write requires password
  4108.  7    group read requires password
  4109.  8    world delete requires password
  4110.  9    world execution requires password (FlexOS)
  4111.  10    world write requires password
  4112.  11    world read requires password
  4113. --------O-214303-----------------------------
  4114. INT 21 - DR DOS 3.41+ internal - SET ACCESS RIGHTS AND PASSWORD
  4115.     AX = 4303h
  4116.     CX = access rights
  4117.          bits 11-0: access rights (see #0766)
  4118.          bit 15: new password is to be set
  4119.     DS:DX -> ASCIZ pathname
  4120.     [DTA] = new password if CX bit 15 is set (blank-padded to 8 characters)
  4121. Return: CF clear if successful
  4122.     CF set on error
  4123.         AX = error code
  4124. Notes:    if the file is already protected, the old password must be added after
  4125.       the pathname, separated by a ";"
  4126.     this function is documented in DR DOS 6.0 and corresponds to the
  4127.       "Get/Set File Attributes" function, subfunction 3, documented in
  4128.       Concurrent DOS.
  4129. SeeAlso: AH=0Fh,AH=17h,AX=4302h"DR DOS",AX=4305h,AX=4454h
  4130. --------O-214304-----------------------------
  4131. INT 21 U - DR DOS 5.0-6.0 internal - GET ENCRYPTED PASSWORD
  4132.     AX = 4304h
  4133.     DS:DX -> ASCIZ filename
  4134.     ???
  4135. Return: CF clear if successful
  4136.         CX = AX = 0000h if no password assigned to file
  4137.     CF set on error
  4138.         AX = error code (see #1020 at AH=59h/BX=0000h)
  4139. Note:    this function is only supported by DR DOS 5.0 and 6.0 and DRMDOS 5.1
  4140. SeeAlso: AX=4303h,AX=4305h
  4141. --------O-214305-----------------------------
  4142. INT 21 U - DR DOS 5.0-6.0 internal - SET EXTENDED FILE ATTRIBUTES
  4143.     AX = 4305h
  4144.     DS:DX -> ASCIZ filename
  4145.     ???
  4146. Return: CF clear if successful
  4147.     CF set on error
  4148.         AX = error code (see #1020 at AH=59h/BX=0000h)
  4149. Desc:    this function allows the extended attributes, and optionally the
  4150.       encrypted password, of a file to be set.
  4151. Note:    this function is only supported by DR DOS 5.0 and 6.0 and DRMDOS 5.1
  4152. SeeAlso: AX=4304h,AX=4311h
  4153. --------O-214306-----------------------------
  4154. INT 21 - DR DOS 6.0 - GET FILE OWNER
  4155.     AX = 4306h
  4156.     DS:DX -> ASCIZ filename
  4157. Return: CF clear if successful
  4158.         AX = CX = value set with AX=4307h
  4159.     CF set on error
  4160.         AX = error code (see #1020 at AH=59h/BX=0000h)
  4161. SeeAlso: AX=4307h
  4162. --------O-214307-----------------------------
  4163. INT 21 - DR DOS 6.0 - SET FILE OWNER
  4164.     AX = 4307h
  4165.     CX = ??? (owner identification number?)
  4166.     DS:DX -> ASCIZ filename
  4167. Return: CF clear if successful
  4168.     CF set on error
  4169.         AX = error code (see #1020 at AH=59h/BX=0000h)
  4170. SeeAlso: AX=4306h
  4171. --------N-214310-----------------------------
  4172. INT 21 - Banyan VINES 2.1+ - GET EXTENDED FILE ATTRIBUTES
  4173.     AX = 4310h
  4174.     DS:DX -> ASCIZ filename
  4175. Return: CF clear if successful
  4176.         CH = attributes (see #0767)
  4177.     CF set on error
  4178.         AX = error code (01h,02h,03h,05h) (see #1020 at AH=59h/BX=0000h)
  4179. Note:    the filename may be a directory but must be on a VINES file service
  4180. SeeAlso: AX=4300h,AX=4311h,AH=B6h,INT 2F/AX=110Fh
  4181. --------N-214311-----------------------------
  4182. INT 21 - Banyan VINES 2.1+ - SET EXTENDED FILE ATTRIBUTES
  4183.     AX = 4311h
  4184.     CH = new attributes (see #0767)
  4185.     DS:DX -> ASCIZ filename
  4186. Return: CF clear if successful
  4187.     CF set on error
  4188.         AX = error code (01h,02h,03h,05h) (see #1020 at AH=59h/BX=0000h)
  4189. Note:    the filename may be a directory but must be on a VINES file service
  4190. SeeAlso: AX=4301h,AX=4305h,AX=4310h,INT 2F/AX=110Eh
  4191.  
  4192. Bitfields for VINES extended file attributes:
  4193. Bit(s)    Description    (Table 0767)
  4194.  7    unused
  4195.  6    shareable
  4196.  5    execute-only
  4197.  4-0    unused
  4198. --------u-214321BX0000-----------------------
  4199. INT 21 - Q87, Q387 - INSTALLATION CHECK
  4200.     AX = 4321h
  4201.     BX = 0000h
  4202.     EAX = 87654321h (entire EAX value is required, not just AX)
  4203. Return: EAX = 12345678h if installed
  4204. Program: Q387 (renamed to Q87 as of v3.7) is a math coprocessor emulator from
  4205.       Quickware
  4206. Note:    this function is available only in virtual-86 mode in older versions;
  4207.       newer versions also provide it in MS Windows 16- and 32-bit protected
  4208.       mode
  4209. SeeAlso: AX=4321h/BX=0001h,AX=4321h/BX=0002h,INT 67/AX=4321h
  4210. --------u-214321BX0001-----------------------
  4211. INT 21 - Q87, Q387 - ENABLE EMULATOR
  4212.     AX = 4321h
  4213.     BX = 0001h
  4214.     EAX = 87654321h (entire EAX value is required, not just AX)
  4215. Desc:    enable the emulator by setting the CPU MSW's EM bit and updating
  4216.       the BIOS equipment list
  4217. Note:    this function is available only in virtual-86 mode in older versions;
  4218.       newer versions also provide it in MS Windows 16- and 32-bit protected
  4219.       mode
  4220. SeeAlso: AX=4321h/BX=0000h,AX=4321h/BX=0002h
  4221. --------u-214321BX0002-----------------------
  4222. INT 21 - Q87, Q387 - DISABLE EMULATOR
  4223.     AX = 4321h
  4224.     BX = 0002h
  4225.     EAX = 87654321h (entire EAX value is required, not just AX)
  4226. Desc:    disable the emulator by clearing the CPU MSW's EM bit and updating
  4227.       the BIOS equipment list
  4228. Note:    this function is available only in virtual-86 mode in older versions;
  4229.       newer versions also provide it in MS Windows 16- and 32-bit protected
  4230.       mode
  4231. SeeAlso: AX=4321h/BX=0000h,AX=4321h/BX=0001h
  4232. --------O-214380-----------------------------
  4233. INT 21 - Novell DOS 7 - UNDELETE PENDING DELETE FILE
  4234.     AX = 4380h
  4235.     ???
  4236. Return: ???
  4237. SeeAlso: AH=41h,AX=4381h
  4238. --------O-214381-----------------------------
  4239. INT 21 - Novell DOS 7 - PURGE PENDING DELETE FILE
  4240.     AX = 4381h
  4241.     ???
  4242. Return: ???
  4243. SeeAlso: AH=41h,AX=4380h
  4244. --------D-214400-----------------------------
  4245. INT 21 - DOS 2+ - IOCTL - GET DEVICE INFORMATION
  4246.     AX = 4400h
  4247.     BX = handle
  4248. Return: CF clear if successful
  4249.         DX = device information word (see #0768)
  4250.         AX destroyed
  4251.     CF set on error
  4252.         AX = error code (01h,05h,06h) (see #1020 at AH=59h/BX=0000h)
  4253. Notes:    value in DH corresponds to high byte of device driver's attribute word
  4254.       if handle refers to a character device
  4255.     Novell NetWare reportedly does not return a drive number in bits 5-0
  4256.       for a disk file
  4257. SeeAlso: AX=4401h,INT 2F/AX=122Bh
  4258.  
  4259. Bitfields for device information word:
  4260. Bit(s)    Description    (Table 0768)
  4261.  character device
  4262.   14    device driver can process IOCTL requests (see AX=4402h"DOS 2+")
  4263.   13    output until busy supported
  4264.   11    driver supports OPEN/CLOSE calls
  4265.    7    set (indicates device)
  4266.    6    EOF on input
  4267.    5    raw (binary) mode
  4268.    4    device is special (uses INT 29)
  4269.    3    clock device
  4270.    2    NUL device
  4271.    1    standard output
  4272.    0    standard input
  4273.  disk file
  4274.   15    file is remote (DOS 3.0+)
  4275.   14    don't set file date/time on closing (DOS 3.0+)
  4276.   11    media not removable
  4277.    8    (DOS 4 only) generate INT 24 if no disk space on write or read past
  4278.       end of file
  4279.    7    clear (indicates file)
  4280.    6    file has not been written
  4281.   5-0    drive number (0 = A:)
  4282. SeeAlso: INT 29
  4283. --------D-214401-----------------------------
  4284. INT 21 - DOS 2+ - IOCTL - SET DEVICE INFORMATION
  4285.     AX = 4401h
  4286.     BX = handle (must refer to character device)
  4287.     DX = device information word (see #0768)
  4288.         (DH must be zero)
  4289. Return: CF clear if successful
  4290.     CF set on error
  4291.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  4292. SeeAlso: AX=4400h,INT 2F/AX=122Bh
  4293. --------D-214402-----------------------------
  4294. INT 21 - DOS 2+ - IOCTL - READ FROM CHARACTER DEVICE CONTROL CHANNEL
  4295.     AX = 4402h
  4296.     BX = file handle referencing character device
  4297.     CX = number of bytes to read
  4298.     DS:DX -> buffer
  4299. Return: CF clear if successful
  4300.         AX = number of bytes actually read
  4301.     CF set on error
  4302.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  4303. Note:    format of data is driver-specific
  4304.       (also see separate entries below for some specific cases)
  4305. SeeAlso: AX=4400h,AX=4403h"DOS",AX=4404h"DOS",INT 2F/AX=122Bh
  4306. --------N-214402-----------------------------
  4307. INT 21 - Network Driver Interface Specification (NDIS) 2.0.1 - PROTOCOL MANAGER
  4308.     AX = 4402h
  4309.     BX = file handle for device "PROTMAN$"
  4310.     CX = 000Eh (size of request block)
  4311.     DS:DX -> request block (see #0769,#0770,#0771,#0772,#0773,#0777,#0778)
  4312. Return: CF clear if successful
  4313.         AX = number of bytes actually read
  4314.     CF set on error
  4315.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  4316. SeeAlso: AX=4402h"FTPSOFT"
  4317.  
  4318. Format of NDIS request block for GetProtocolManagerInfo:
  4319. Offset    Size    Description    (Table 0769)
  4320.  00h    WORD    01h
  4321.  02h    WORD    returned status (see #0779)
  4322.  04h    DWORD    returned pointer to structure representing parsed user config
  4323.  08h    DWORD    unused
  4324.  0Ch    WORD    returned BCD version of NDIS on which Protocol Manager is based
  4325. SeeAlso: #0770,#0771,#0772,#0773,#0774,#0775,#0776,#0777,#0778
  4326.  
  4327. Format of NDIS request block for RegisterModule:
  4328. Offset    Size    Description    (Table 0770)
  4329.  00h    WORD    02h
  4330.  02h    WORD    returned status (see #0779)
  4331.  04h    DWORD    pointer to module's common characteristics table (see #0780)
  4332.  08h    DWORD    pointer to list of modules to which the module is to be bound
  4333.  0Ch    WORD    unused
  4334. SeeAlso: #0769,#0771,#0772,#0773,#0774,#0775,#0776,#0777,#0778
  4335.  
  4336. Format of NDIS request block for BindAndStart:
  4337. Offset    Size    Description    (Table 0771)
  4338.  00h    WORD    03h
  4339.  02h    WORD    returned status (see #0779)
  4340.  04h    DWORD    caller's virtual address in FailingModules structure
  4341.  08h    DWORD    unused
  4342.  0Ch    WORD    unused
  4343. SeeAlso: #0769,#0770,#0772,#0773,#0774,#0775,#0776,#0777,#0778
  4344.  
  4345. Format of NDIS request block for GetProtocolManagerLinkage:
  4346. Offset    Size    Description    (Table 0772)
  4347.  00h    WORD    04h
  4348.  02h    WORD    returned status (see #0779)
  4349.  04h    DWORD    returned dispatch point
  4350.  08h    DWORD    unused
  4351.  0Ch    WORD    returned protocol manager DS
  4352. Note:    the dispatch point may be called as follows instead of using this IOCTL
  4353.     STACK: WORD  protocol manager DS
  4354.            DWORD pointer to request block
  4355.     Return: AX = returned status
  4356.         STACK popped
  4357. SeeAlso: #0769,#0770,#0771,#0773,#0774,#0775,#0776,#0777,#0778
  4358.  
  4359. Format of NDIS request block for GetProtocolIniPath:
  4360. Offset    Size    Description    (Table 0773)
  4361.  00h    WORD    05h
  4362.  02h    WORD    returned status (see #0779)
  4363.  04h    DWORD    pointer to a buffer for the ASCIZ pathname of PROTOCOL.INI
  4364.  08h    DWORD    unused
  4365.  0Ch    WORD    buffer length
  4366. SeeAlso: #0769,#0770,#0771,#0772,#0774,#0775,#0776,#0777,#0778
  4367.  
  4368. Format of NDIS request block for RegisterProtocolManagerInfo:
  4369. Offset    Size    Description    (Table 0774)
  4370.  00h    WORD    06h
  4371.  02h    WORD    returned status (see #0779)
  4372.  04h    DWORD    pointer to structure containing parsed user config file
  4373.  08h    DWORD    unused
  4374.  0Ch    WORD    length of structure
  4375. SeeAlso: #0769,#0770,#0771,#0772,#0773,#0775,#0776,#0777,#0778
  4376.  
  4377. Format of NDIS request block for InitAndRegister:
  4378. Offset    Size    Description    (Table 0775)
  4379.  00h    WORD    07h
  4380.  02h    WORD    returned status (see #0779)
  4381.  04h    DWORD    unused
  4382.  08h    DWORD    poitner to ASCIZ name of the module to be prebind initialized
  4383.  0Ch    WORD    unused
  4384. SeeAlso: #0769,#0770,#0771,#0772,#0773,#0774,#0776,#0777,#0778
  4385.  
  4386. Format of NDIS request block for UnbindAndStop:
  4387. Offset    Size    Description    (Table 0776)
  4388.  00h    WORD    08h
  4389.  02h    WORD    returned status (see #0779)
  4390.  04h    DWORD    failing modules as for BindAndStart
  4391.  08h    DWORD    if not 0000h:0000h, pointer to ASCIZ name of module to unbind
  4392.         if 0000h:0000h, terminate a set of previously dynamically
  4393.           bound protocol modules
  4394.  0Ch    WORD    unused
  4395. SeeAlso: #0769,#0770,#0771,#0772,#0773,#0774,#0775,#0777,#0778
  4396.  
  4397. Format of NDIS request block for BindStatus:
  4398. Offset    Size    Description    (Table 0777)
  4399.  00h    WORD    09h
  4400.  02h    WORD    returned status (see #0779)
  4401.  04h    DWORD    must be 0000h:0000h
  4402.         on return, points to root tree
  4403.  08h    DWORD    0000h:0000h
  4404.  0Ch    WORD    unused under DOS
  4405. SeeAlso: #0769,#0770,#0771,#0772,#0773,#0774,#0775,#0776,#0778
  4406.  
  4407. Format of NDIS request block for RegisterStatus:
  4408. Offset    Size    Description    (Table 0778)
  4409.  00h    WORD    0Ah
  4410.  02h    WORD    returned status (0000h, 0008h, 002Ch) (see #0779)
  4411.  04h    DWORD    0000h:0000h
  4412.  08h    DWORD    pointer to 16-byte ASCIZ module name
  4413.  0Ch    WORD    0000h
  4414. Note:    not supported by the 10NET v5.0 PROTMAN$ driver
  4415. SeeAlso: #0769,#0770,#0771,#0772,#0773,#0774,#0775,#0776,#0777
  4416.  
  4417. (Table 0779)
  4418. Values for NDIS status code:
  4419.  0000h    success
  4420.  0001h    wait for release--protocol has retained control of the data buffer
  4421.  0002h    request queued
  4422.  0003h    frame not recognized
  4423.  0004h    frame rejected
  4424.  0005h    frame should be forwarded
  4425.  0006h    out of resource
  4426.  0007h    invalid parameter
  4427.  0008h    invalid function
  4428.  0009h    not supported
  4429.  000Ah    hardware error
  4430.  000Bh    transmit error
  4431.  000Ch    unrecognized destination
  4432.  000Dh    buffer too small
  4433.  0020h    already started
  4434.  0021h    binding incomplete
  4435.  0022h    driver not initialized
  4436.  0023h    hardware not found
  4437.  0024h    hardware failure
  4438.  0025h    configuration failure
  4439.  0026h    interrupt conflict
  4440.  0027h    MAC incompatible
  4441.  0028h    initialization failed
  4442.  0029h    no binding
  4443.  002Ah    network may be disconnected
  4444.  002Bh    incompatible OS version
  4445.  002Ch    already registered
  4446.  002Dh    path not found
  4447.  002Eh    insufficient memory
  4448.  002Fh    info not found
  4449.  00FFh    general failure
  4450.  F000h-FFFFh reserved for vendor-specific codes, treated as general failure
  4451.  
  4452. Format of NDIS common characteristics table:
  4453. Offset    Size    Description    (Table 0780)
  4454.  00h    WORD    size of table in bytes
  4455.  02h    BYTE    NDIS major version
  4456.  03h    BYTE    NDIS minor version
  4457.  04h    WORD    reserved
  4458.  06h    BYTE    module major version
  4459.  07h    BYTE    module minor version
  4460.  08h    DWORD    module function flag bits
  4461.         bit 0: binding at upper boundary supported
  4462.         bit 1: binding at lower boundary supported
  4463.         bit 2: dynamically bound
  4464.         bits 3-31 reserved, must be 0
  4465.  0Ch 16 BYTEs    ASCIZ module name
  4466.  1Ch    BYTE    upper boundary protocol level (see #0781)
  4467.  1Dh    BYTE    upper boundary interface type
  4468.         for MACs: 1 = MAC
  4469.         for data links and transports: to be defined
  4470.         for session: 1 = NCB
  4471.         any level: 0 = private (ISV-defined)
  4472.  1Eh    BYTE    lower boundary protocol level (see #0781)
  4473.  1Fh    BYTE    lower boundary interface type
  4474.         same as offset 1Dh
  4475.  20h    WORD    module ID filled in by protocol manager
  4476.  22h    WORD    module DS
  4477.  24h    DWORD    system request entry point
  4478.  28h    DWORD    pointer to service-specific characteristics (see #0783,#0785)
  4479.         0000h:0000h if none
  4480.  2Ch    DWORD    pointer to service-specific status, or 0000h:0000h if none
  4481.           (see #0786)
  4482.  30h    DWORD    pointer to upper dispatch table (see #0782)
  4483.         0000h:0000h if none
  4484.  34h    DWORD    pointer to lower dispatch table (see #0782)
  4485.         0000h:0000h if none
  4486.  38h  2 DWORDs    reserved, must be 0
  4487. Note:    for compatibility with NDIS 1.x.x, a major version of 00h is
  4488.       interpreted as 01h
  4489.  
  4490. (Table 0781)
  4491. Values for NDIS boundary protocol level:
  4492.  00h    physical
  4493.  01h    Media Access Control
  4494.  02h    Data link
  4495.  03h    network
  4496.  04h    transport
  4497.  05h    session
  4498.  FFh    not specified
  4499.  
  4500. Format of NDIS dispatch table:
  4501. Offset    Size    Description    (Table 0782)
  4502.  00h    DWORD    -> common characteristics table (see #0780)
  4503.  04h  4 BYTEs    ???
  4504.  08h    DWORD    -> ??? function (called with 12 bytes of stack arguments)
  4505.  0Ch    DWORD    -> ??? function (called with 10 bytes of stack arguments)
  4506.  10h    DWORD    -> ??? function (called with 16 bytes of stack arguments)
  4507.  14h    DWORD    -> ??? function (called with 4 bytes of stack arguments)
  4508.  18h    DWORD    -> ??? function (called with 18 bytes of stack arguments)
  4509.  1Ch    DWORD    -> ??? function (called with 12 bytes of stack arguments)
  4510.  
  4511. Format of MAC Service-Specific Characteristics Table:
  4512. Offset    Size    Description    (Table 0783)
  4513.  00h    WORD    length of table in bytes
  4514.  02h 16 BYTEs    ASCIZ MAC type name, "802.3", "802.4", "802.5", "802.6", "DIX",
  4515.           "DIX+802.3", "APPLETALK", "ARCNET", "FDDI", "SDLC", "BSC",
  4516.           "HDLC", or "ISDN"
  4517.  12h    WORD    length of station addresses in bytes
  4518.  14h 16 BYTEs    permanent station address
  4519.  24h 16 BYTEs    current station address
  4520.  34h    DWORD    current functional adapter address (00000000h if none)
  4521.  38h    DWORD    pointer to multicast address list
  4522.  3Ch    DWORD    link speed in bits/sec
  4523.  40h    DWORD    service flags (see #0784)
  4524.  44h    WORD    maximum frame size which may be both sent and received
  4525.  46h    DWORD    total transmit buffer capacity in bytes
  4526.  4Ah    WORD    transmit buffer allocation block size in bytes
  4527.  4Ch    DWORD    total receive buffer capacity in bytes
  4528.  50h    WORD    receive buffer allocation block size in bytes
  4529.  52h  3 BYTEs    IEEE vendor code
  4530.  55h    BYTE    vendor adapter code
  4531.  56h    DWORD    pointer to ASCIZ vendor adapter description
  4532.  5Ah    WORD    IRQ used by adapter
  4533.  5Ch    WORD    transmit queue depth
  4534.  5Eh    WORD    maximum supported number of data blocks in buffer descriptors
  4535.  60h  N BYTEs    vendor-specific info
  4536. SeeAlso: #0785
  4537.  
  4538. Bitfields for service flags:
  4539. Bit(s)    Description    (Table 0784)
  4540.  0    supports broadcast
  4541.  1    supports multicast
  4542.  2    supports functional/group addressing
  4543.  3    supports promiscuous mode
  4544.  4    station address software settable
  4545.  5    statistics always current
  4546.  6    supports InitiateDiagnostics
  4547.  7    supports loopback
  4548.  8    MAC does primarily ReceiveChain indications instead of ReceiveLookahead
  4549.     indications
  4550.  9    supports IBM source routing
  4551.  10    supports MAC reset
  4552.  11    supports Open/Close adapter
  4553.  12    supports interrupt request
  4554.  13    supports source routing bridge
  4555.  14    supports GDT virtual addresses (OS/2 version)
  4556.  15    multiple TransferDatas allowed durign a single indication
  4557.  16    MAC normally sets FrameSize = 0 in ReceiveLookahead
  4558.  17-31    reserved, must be 0
  4559.  
  4560. Format of NetBIOS Service-Specific Characteristics Table:
  4561. Offset    Size    Description    (Table 0785)
  4562.  00h    WORD    length of table in bytes
  4563.  02h 16 BYTEs    ASCIZ type name of NetBIOS module
  4564.  12h    WORD    NetBIOS module code
  4565.  14h  N BYTEs    vendor-specific info
  4566. SeeAlso: #0783
  4567.  
  4568. Format of MAC Service-Specific Status Table:
  4569. Offset    Size    Description    (Table 0786)
  4570.  00h    WORD    length of table in bytes
  4571.  02h    DWORD    seconds since 0:00 1/1/70 when diagnostics last run
  4572.         (FFFFFFFFh = never)
  4573.  06h    DWORD    MAC status bits (see #0787)
  4574.  0Ah    WORD    current packet filter flags (see #0788)
  4575.  0Ch    DWORD    pointer to media-specific status table or 0000h:0000h
  4576.  10h    DWORD    seconds past 0:00 1/1/70 of last ClearStatistics
  4577.  14h    DWORD    total frames received (FFFFFFFFh = not counted)
  4578.  18h    DWORD    frames with CRC error (FFFFFFFFh = not counted)
  4579.  1Ch    DWORD    total bytes received (FFFFFFFFh = not counted)
  4580.  20h    DWORD    frames discarded--no buffer space (FFFFFFFFh = not counted)
  4581.  24h    DWORD    multicast frames received (FFFFFFFFh = not counted)
  4582.  28h    DWORD    broadcast frames received (FFFFFFFFh = not counted)
  4583.  2Ch    DWORD    frames with errors (FFFFFFFFh = not counted)
  4584.  30h    DWORD    overly large frames (FFFFFFFFh = not counted)
  4585.  34h    DWORD    frames less than minimum size (FFFFFFFFh = not counted)
  4586.  38h    DWORD    multicast bytes received (FFFFFFFFh = not counted)
  4587.  3Ch    DWORD    broadcast bytes received (FFFFFFFFh = not counted)
  4588.  40h    DWORD    frames discarded--hardware error (FFFFFFFFh = not counted)
  4589.  44h    DWORD    total frames transmitted (FFFFFFFFh = not counted)
  4590.  48h    DWORD    total bytes transmitted (FFFFFFFFh = not counted)
  4591.  4Ch    DWORD    multicast frames transmitted (FFFFFFFFh = not counted)
  4592.  50h    DWORD    broadcast frames transmitted (FFFFFFFFh = not counted)
  4593.  54h    DWORD    broadcast bytes transmitted (FFFFFFFFh = not counted)
  4594.  58h    DWORD    multicast bytes transmitted (FFFFFFFFh = not counted)
  4595.  5Ch    DWORD    frames not transmitted--timeout (FFFFFFFFh = not counted)
  4596.  60h    DWORD    frames not transmitted--hardware error (FFFFFFFFh = not countd)
  4597.  64h  N BYTEs    vendor-specific info
  4598.  
  4599. Bitfields for MAC status bits:
  4600. Bit(s)    Description    (Table 0787)
  4601.  0-2    operational status
  4602.     000 hardware not installed
  4603.     001 hardware failed startup diagnostics
  4604.     010 hardware configuration problem
  4605.     011 hardware fault
  4606.     100 operating marginally due to soft faults
  4607.     101 reserved
  4608.     110 reserved
  4609.     111 hardware fully operational
  4610.  3    MAC bound
  4611.  4    MAC open
  4612.  5    diagnostics in progress
  4613.  6-31    reserved
  4614.  
  4615. Bitfields for packet filter flags:
  4616. Bit(s)    Description    (Table 0788)
  4617.  0    directed/multicast or group/functional
  4618.  1    broadcast
  4619.  2    promiscuous
  4620.  3    all source routing
  4621.  4-15    reserved, must be zero
  4622. --------D-214402-----------------------------
  4623. INT 21 U - MS-DOS 7.0 - CONFIG$ device - GET CONFIGURATION INFORMATION
  4624.     AX = 4402h
  4625.     BX = file handle for character device "CONFIG$"
  4626.     CX = number of bytes to read (at least 5)
  4627.     DS:DX -> buffer for ??? data (see #3454)
  4628. Return: CF clear if successful
  4629.         AX = number of bytes actually read
  4630.     CF set on error
  4631.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  4632. SeeAlso: AX=4403h"CONFIG$"
  4633.  
  4634. Format of MS-DOS 7.0 CONFIG$ ??? data:
  4635. Offset    Size    Description    (Table 3454)
  4636.  00h    WORD    ??? (0000h)
  4637.  02h    WORD    ??? (0000h or value read from IO.SYS segment 70h)
  4638.  04h    BYTE    ??? (value read from IO.SYS segment 70h)
  4639. --------I-214402-----------------------------
  4640. INT 21 U - IBM SYSTEM 36/38 WORKSTATION EMULATION - VDI.SYS - GET ???
  4641.     AX = 4402h
  4642.     BX = handle for character device "GDMS"
  4643.     CX = number of bytes to read (>= 4)
  4644.     DS:DX -> buffer (see #0789)
  4645. Return: CF set on error
  4646.         AX = error code (see #1020 at AH=59h/BX=0000h)
  4647.     CF clear if successful
  4648.         AX = number of bytes read
  4649.  
  4650. Format of System 36/38 emulator returned data:
  4651. Offset    Size    Description    (Table 0789)
  4652.  00h  4 BYTEs    ???
  4653.  04h    DWORD    pointer to ???
  4654.  08h  4 BYTEs    ???
  4655. --------m-214402-----------------------------
  4656. INT 21 U - LASTBYTE.SYS v1.19 - IOCTL - GET ??? TABLE
  4657.     AX = 4402h
  4658.     BX = handle for device "LA$TBYTE"
  4659.     CX = 0004h
  4660.     DS:DX -> DWORD to hold address of 39-byte table of ???
  4661. Return: CF set on error
  4662.         AX = error code (see #1020 at AH=59h/BX=0000h)
  4663.     CF clear if successful
  4664.         AX = number of bytes read
  4665. Program: LASTBYTE.SYS is part of the shareware "The Last Byte" memory
  4666.       management package by Key Software Products
  4667. SeeAlso: AX=4402h"HIGHUMM"
  4668. --------m-214402-----------------------------
  4669. INT 21 - HIGHUMM.SYS v1.17+ - IOCTL - GET API ADDRESS
  4670.     AX = 4402h
  4671.     BX = handle for device "KSP$UMM"
  4672.     CX = 0004h
  4673.     DS:DX -> DWORD to hold entry point (see #0790)
  4674. Return: CF set on error
  4675.         AX = error code (see #1020 at AH=59h/BX=0000h)
  4676.     CF clear if successful
  4677.         AX = number of bytes read
  4678. Program: HIGHUMM.SYS is part of the shareware "The Last Byte" memory
  4679.       management package by Key Software Products
  4680. SeeAlso: AX=4402h"LASTBYTE"
  4681.  
  4682. (Table 0790)
  4683. Call HIGHUMM.SYS entry point with:
  4684.     AH = 00h allocate UMB (same as XMS function 10h) (see INT 2F/AX=4310h)
  4685.         DX = size in paragraphs
  4686.         Return: BX = segment number (if successful)
  4687.             DX = size of requested block/size of largest block
  4688.     AH = 01h deallocate UMB (same as XMS func 11h) (see INT 2F/AX=4310h)
  4689.         DX = segment number of UMB
  4690.     AH = 02h request a bank-switched memory block
  4691.         DX = size in paragraphs
  4692.         Return: BX = segment number (if successful)
  4693.             DX = size of requested block/size of largest block
  4694.     AH = 03h release a bank-switched memory block
  4695.         DX = segment number
  4696.     AH = 04h transfer data to/from high memory
  4697.         DS:SI -> source
  4698.         ES:DI -> destination
  4699.         CX = length in bytes
  4700.         Note: enables bank-switched memory, does the copy, then disables
  4701.         bank-switched memory
  4702.     AH = 05h get a word from bank-switched memory
  4703.         ES:DI -> word to read
  4704.         Return: DX = word
  4705.     AH = 06h put a word to bank-switched memory
  4706.         ES:DI -> word to write
  4707.         DX = word
  4708.     AH = 07h put a byte to bank-switched memory
  4709.         ES:DI -> byte to write
  4710.         DL = byte
  4711.     AH = 08h enable bank-switched memory
  4712.         DS:SI -> 6-byte status save area
  4713.     AH = 09h disable bank-switched memory
  4714.         DS:SI -> 6-byte save area from enable call (AH=08h)
  4715.     AH = 0Ah assign name to UMB or high bank-switched block
  4716.         DX = segment number
  4717.         DS:SI -> 8-byte blank-padded name
  4718.     AH = 0Bh locate UMB block by name
  4719.         DS:SI -> 8-byte blank-padded name
  4720.         Return: BX = segment number (if successful)
  4721.             DX = size of block
  4722.     AH = 0Ch locate bank-switched block by name
  4723.         DS:SI -> 8-byte blank-padded name
  4724.         Return: BX = segment number (if successful)
  4725.             DX = size of block
  4726. Return: AX = status code
  4727.         0001h successful
  4728.         0000h failed
  4729.         BL = error code
  4730.             80h not implemented
  4731.             B0h insufficient memory, smaller block available
  4732.             B1h insufficient memory, no blocks available
  4733.             B2h invalid segment number
  4734. Note:    only functions 00h and 01h are always available; the remaining
  4735.       functions are only enabled if the proper commandline switch is given
  4736. --------c-214402-----------------------------
  4737. INT 21 - SMARTDRV.SYS v3.x only - IOCTL - GET CACHE STATUS
  4738.     AX = 4402h
  4739.     BX = file handle for device "SMARTAAR"
  4740.     CX = number of bytes to read (min 28h)
  4741.     DS:DX -> buffer for status record (see #0791)
  4742. Return: CF clear if successful
  4743.         AX = number of bytes actually read
  4744.     CF set on error
  4745.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  4746. Note:    NCache2 (from the Norton Utilities v8.0) attempts to support this
  4747.       interface, but does not do so correctly, often hanging the system;
  4748.       one should use the SmartDrive v4.x or NCache private interfaces
  4749.       (see INT 2F/AX=4A10h/BX=0000h,INT 2F/AX=FE00h/DI=4E55h)
  4750. SeeAlso: AX=4403h"SMARTDRV",INT 2F/AX=4A10h/BX=0000h
  4751.  
  4752. Format of SMARTDRV status record:
  4753. Offset    Size    Description    (Table 0791)
  4754.  00h    BYTE    write-through flag (always 01h)
  4755.  01h    BYTE    writes should be buffered (always 00h)
  4756.  02h    BYTE    cache enabled if 01h
  4757.  03h    BYTE    driver type (01h extended memory, 02h expanded)
  4758.  04h    WORD    clock ticks between cache flushes (currently unused)
  4759.  06h    BYTE    cache contains locked tracks if nonzero
  4760.  07h    BYTE    flush cache on INT 19 reboot if nonzero
  4761.  08h    BYTE    cache full track writes if nonzero
  4762.  09h    BYTE    double buffering (for VDS) state (00h off, 01h on, 02h dynamic)
  4763.  0Ah    DWORD    original INT 13 vector
  4764.  0Eh    BYTE    minor version number
  4765.  0Fh    BYTE    major version number
  4766.  10h    WORD    unused
  4767.  12h    WORD    sectors read            \
  4768.  14h    WORD    sectors already in cache     > may be scaled rather than
  4769.  16h    WORD    sectors already in track buffer /  absolute counts
  4770.  18h    BYTE    cache hit rate in percent
  4771.  19h    BYTE    track buffer hit rate in percent
  4772.  1Ah    WORD    total tracks in cache
  4773.  1Ch    WORD    number of tracks in use
  4774.  1Eh    WORD    number of locked tracks
  4775.  20h    WORD    number of dirty tracks
  4776.  22h    WORD    current cache size in 16K pages
  4777.  24h    WORD    original (maximum) cache size in 16K pages
  4778.  26h    WORD    minimum cache size in 16K pages
  4779.  28h    DWORD    pointer to byte flag to increment for locking cache contents
  4780. --------d-214402-----------------------------
  4781. INT 21 - CD-ROM device driver - IOCTL INPUT
  4782.     AX = 4402h
  4783.     BX = file handle referencing character device for CD-ROM driver
  4784.     CX = number of bytes to read
  4785.     DS:DX -> control block (see #0793)
  4786. Return: CF clear if successful
  4787.         AX = number of bytes actually read
  4788.     CF set on error
  4789.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  4790. Note:    the data returned depends on the first byte of the control block; the
  4791.       remainder of the control block is filled by the driver
  4792. SeeAlso: AX=4403h"CD-ROM",INT 2F/AX=0802h
  4793.  
  4794. (Table 0792)
  4795. Values for CD-ROM data being requested:
  4796.  00h    device driver header address
  4797.  01h    drive head location
  4798.  02h    reserved
  4799.  03h    error statistics
  4800.  04h    audio channel info
  4801.  05h    raw drive bytes (uninterpreted and device-specific)
  4802.  06h    device status
  4803.  07h    sector size
  4804.  08h    volume size
  4805.  09h    media change status
  4806.  0Ah    audio disk info
  4807.  0Bh    audio track info
  4808.  0Ch    audio Q-Channel info
  4809.  0Dh    audio sub-channel info
  4810.  0Eh    UPC code
  4811.  0Fh    audio status info
  4812.  
  4813. Format of CD-ROM control block:
  4814. Offset    Size    Description    (Table 0793)
  4815.  00h    BYTE    data being requested (see #0792)
  4816. ---function 00h---
  4817.  01h    DWORD    device driver header address (see also AH=52h,#0987)
  4818. ---function 01h---
  4819.  01h    BYTE    addressing mode
  4820.         00h HSG
  4821.         01h Red Book
  4822.  02h    DWORD    current location of drive's head
  4823.         logical sector number in HSG mode
  4824.         frame/second/minute/unused in Red Book mode
  4825.         (HSG sector = minute * 4500 + second * 75 + frame - 150)
  4826. ---function 03h---
  4827.  01h  N BYTEs    undefined as of 5 Aug 88 specification
  4828. ---function 04h---
  4829.  01h    BYTE    input channel (0-3) for output channel 0
  4830.  02h    BYTE    volume for output channel 0
  4831.  03h    BYTE    input channel (0-3) for output channel 1
  4832.  04h    BYTE    volume for output channel 1
  4833.  05h    BYTE    input channel (0-3) for output channel 2
  4834.  06h    BYTE    volume for output channel 2
  4835.  07h    BYTE    input channel (0-3) for output channel 3
  4836.  08h    BYTE    volume for output channel 3
  4837. Notes:    output channels 0 and 1 are left and right, 2 and 3 are left prime and
  4838.       right prime; a volume of 00h is off
  4839.     the default setting is for each input channel to be assigned to the
  4840.       same-numbered output channel at full (FFh) volume
  4841. ---function 05h---
  4842.  01h    BYTE    number of bytes read
  4843.  02h 128 BYTEs    buffer for drive bytes
  4844. ---function 06h---
  4845.  01h    DWORD    device parameters (see #0794)
  4846. ---function 07h---
  4847.  01h    BYTE    read mode
  4848.         00h cooked
  4849.         01h raw
  4850.  02h    WORD    sector size in bytes
  4851. ---function 08h---
  4852.  01h    DWORD    volume size in sectors
  4853. ---function 09h---
  4854.  01h    BYTE    media change status
  4855.         00h don't know
  4856.         01h media unchanged
  4857.         FFh media has been changed
  4858. ---function 0Ah---
  4859.  01h    BYTE    lowest audio track number
  4860.  02h    BYTE    highest audio track number
  4861.  03h    DWORD    start address of lead-out track (Red Book format)
  4862. --function 0Bh---
  4863.  01h    BYTE    track number (set by caller)
  4864.  02h    DWORD    starting point of track (Red Book format)
  4865.  06h    BYTE    track control info
  4866.         bits 15,14,12: track type (notice: bits not contiguous!)
  4867.             000 two audio channels, no pre-emphasis
  4868.             001 two audio channels with pre-emphasis
  4869.             010 data track
  4870.             100 four audio channels, no pre-emphasis
  4871.             101 four audio channels with pre-emphasis
  4872.             other reserved
  4873.         bit 13: digital copy permitted
  4874. ---function 0Ch---
  4875.  01h    BYTE    CONTROL and ADR byte (as received from drive)
  4876.  02h    BYTE    track number
  4877.  03h    BYTE    point or index
  4878.  04h    BYTE    minute    \
  4879.  05h    BYTE    second     > running time within track
  4880.  06h    BYTE    frame    /
  4881.  07h    BYTE    zero
  4882.  08h    BYTE    "AMIN" or "PMIN"     \
  4883.  09h    BYTE    "ASEC" or "PSEC"      > running time on disk
  4884.  0Ah    BYTE    "AFRAME" or "PFRAME" /
  4885. ---function 0Dh---
  4886.  01h    DWORD    starting frame address (Red Book format)
  4887.  05h    DWORD    transfer address
  4888.  09h    DWORD    number of sectors to read
  4889. Note:    copies 96 bytes of sub-channel info per sector into buffer
  4890. ---function 0Eh---
  4891.  01h    BYTE    CONTROL and ADR byte
  4892.  02h  7 BYTEs    UPC/EAN code (13 BCD digits,low-order nybble of last byte is 0)
  4893.  09h    BYTE    zero
  4894.  0Ah    BYTE    "AFRAME"
  4895. ---function 0Fh---
  4896.  ??? documentation not yet available
  4897.  01h    WORD    pause status (0000h not paused, 0001h paused)
  4898.  03h    DWORD    audio play start address
  4899.  07h    DWORD    ??? audio play length or end address
  4900.  
  4901. Bitfields for CD-ROM device parameters:
  4902. Bit(s)    Description    (Table 0794)
  4903.  0    door open
  4904.  1    door unlocked
  4905.  2    supports raw reading in addition to cooked
  4906.  3    writable
  4907.  4    can play audio/video tracks
  4908.  5    supports interleaving
  4909.  6    reserved
  4910.  7    supports prefetch requests
  4911.  8    supports audio channel control
  4912.  9    supports Red Book addressing in addition to HSG
  4913.  10    audio is playing
  4914.  11    no disk in drive
  4915.  12    supports R-W subchannels
  4916. --------m-214402-----------------------------
  4917. INT 21 - Quarterdeck - QEMM-386 v5+ - GET API ENTRY POINT
  4918.     AX = 4402h
  4919.     BX = file handle for device "QEMM386$"
  4920.     CX = 0004h
  4921.     DS:DX -> DWORD buffer for API entry point
  4922. Return: CF clear if successful
  4923.         buffer filled (refer to INT 67/AH=3Fh for entry point parameters)
  4924.     CF set on error
  4925.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  4926. Note:    Quarterdeck recently (June 1993) documented this function, but the
  4927.       documentation incorrectly states that it is only available for
  4928.       QEMM 6+
  4929. SeeAlso: AX=4402h"HOOKROM",INT 2F/AX=D201h/BX=5145h,INT 67/AH=3Fh
  4930. --------Q-214402-----------------------------
  4931. INT 21 U - Quarterdeck - HOOKROM.SYS - GET HOOKED VECTOR TABLE
  4932.     AX = 4402h
  4933.     BX = file handle for device "HOOKROM$"
  4934.     CX = 0004h
  4935.     DS:DX -> DWORD buffer for address of hooked vector table (see #0795)
  4936. Return: CF clear if successful
  4937.         DS:DX buffer filled
  4938.     CF set on error
  4939.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  4940. SeeAlso: AX=4402h/SF=01h
  4941.  
  4942. Format of HOOKROM.SYS hooked vector table entry:
  4943. Offset    Size    Description    (Table 0795)
  4944.  00h  5 BYTEs    FAR jump to actual interrupt handler
  4945.         (end of table if first byte is not EAh)
  4946.  05h    BYTE    interrupt vector number
  4947. --------d-214402-----------------------------
  4948. INT 21 - Advanced SCSI Programming Interface (ASPI) - INTERFACE
  4949.     AX = 4402h
  4950.     BX = file handle for device "SCSIMGR$"
  4951.     CX = 0004h or 0005h (refer to notes below)
  4952.     DS:DX -> buffer for result (see #0796), set to zeros before call
  4953. Return: CF clear if successful
  4954.         AX = 0004h or 0005h (refer to notes below)
  4955.     CF set on error
  4956.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  4957. Notes:    the variant of the call requesting five bytes is an UNDOCUMENTED
  4958.       extension supported by Adaptec's ASPI2DOS.SYS, ASPI4DOS.SYS, and
  4959.       ASPI7DOS.SYS; if made of a host manager which does not support the
  4960.       variant, only four bytes will be returned.  If the variant is
  4961.       supported, Adaptec's WINASPI.DLL assumes that the host manager is
  4962.       an "advanced" one which operates in either real or protected mode
  4963.       (and thus does not require a DPMI INT 31/AX=0301h call to be invoked
  4964.       from protected mode).     Support of the five-byte variant also appears
  4965.       to imply that an advanced ASPI host manager uses no temporary
  4966.       storage space except the SRB (see #0798) and the stack, and that it
  4967.       is fully reentrant.
  4968.     if called with a standard request for four bytes, even Adaptec's
  4969.       advanced drivers return only the requested four bytes containing the
  4970.       ASPI entry point address
  4971.     the function address is called with the address of a SCSI Request
  4972.       Block (see #0798) on the stack and the caller must clean up the
  4973.       stack
  4974. SeeAlso: AX=440Ch"ASPITAPE",INT 11/AH=FFh"WD7000"
  4975.  
  4976. Format of ASPI IOCTL result:
  4977. Offset    Size    Description    (Table 0796)
  4978.  00h    DWORD    function address
  4979.  04h    BYTE    number of SCSI host adapters supported by host manager
  4980.  
  4981. (Table 0797)
  4982. Values for ASPI request number:
  4983.  00h    "HA_INQ"    host adapter inquiry / extended host adapter inquiry
  4984.  01h    "GET_TYPE"    get device type
  4985.  02h    "EXEC_SIO"    execute SCSI I/O
  4986.  03h    "ABORT_SRB"    abort SRB
  4987.  04h    "RESET_DEV"    reset SCSI device
  4988.  05h    "SET_HAPRMS"    set host adapter parameters
  4989.  06h    get disk drive information
  4990.  
  4991. Format of SCSI Request Block (64 bytes):
  4992. Offset    Size    Description    (Table 0798)
  4993.  00h    BYTE    request number (see #0797)
  4994.  01h    BYTE    request status (see #0799)
  4995.  02h    BYTE    host adapter ID
  4996.  03h    BYTE    request flags (see #0800)
  4997.  04h    DWORD    reserved (0)
  4998. ---request 00h---
  4999.  08h    BYTE    (ret) number of host adapters
  5000.  09h    BYTE    (ret) target adapter ID
  5001.  0Ah 16 BYTEs    (ret) SCSI manager ID
  5002.  1Ah 16 BYTEs    (ret) host adapter ID
  5003.  2Ah 16 BYTEs    (ret) host adapter-unique parameters
  5004. ---extended request 00h---
  5005.  04h  2 BYTEs    (call) extended request signature 55h AAh
  5006.         (ret) if extended request supported, reply AAh 55h
  5007.  06h    WORD    (call) length of extended buffer at offset 3Ah
  5008.         (ret) number of bytes returned in extended buffer
  5009.  08h    BYTE    (ret) number of host adapters
  5010.  09h    BYTE    (ret) target adapter ID
  5011.  0Ah 16 BYTEs    (ret) SCSI manager ID
  5012.  1Ah 16 BYTEs    (ret) host adapter ID
  5013.  2Ah 16 BYTEs    (ret) host adapter-unique parameters
  5014.  3Ah  N BYTEs    extended buffer
  5015.         3Ah    WORD    features (see #3301)
  5016.         3Ch    WORD    maximum scatter/gather list length
  5017.         3Eh    DWORD    maximum SCIS data transfer size (0 = unlimited)
  5018. ---request 01h---
  5019.  08h    BYTE    target ID
  5020.  09h    BYTE    logical unit number
  5021.  0Ah    BYTE    (ret) device type (see #0803)
  5022. ---request 02h---
  5023.  08h    BYTE    target ID
  5024.  09h    BYTE    logical unit number
  5025.  0Ah    DWORD    data allocation length
  5026.         (ret) residual byte length (if supported and requested)
  5027.  0Eh    BYTE    sense allocation length
  5028.  0Fh    DWORD    data buffer pointer
  5029.  13h    DWORD    next request pointer (for linking)
  5030.  17h    BYTE    CDB length
  5031.  18h    BYTE    (ret) host adapter status (see #0798)
  5032.  19h    BYTE    (ret) target status (see #0802)
  5033.  1Ah    DWORD    post routine address (see #3302)
  5034.  1Eh    WORD    real mode Post DS
  5035.  20h    DWORD    SRB pointer
  5036.  24h    WORD    reserved
  5037.  26h    DWORD    SRB physical address
  5038.  2Ah 22 BYTEs    SCSIMGR$ workspace
  5039.  40h  N BYTEs    CCB, including sense data (20-24 bytes)
  5040. ---request 03h---
  5041.  08h    DWORD    address of SRB to abort
  5042. ---request 04h---
  5043.  08h    BYTE    target ID
  5044.  09h    BYTE    logical unit number
  5045.  0Ah 14 BYTEs    reserved
  5046.  18h    BYTE    (ret) host adapter status (see #0801)
  5047.  19h    BYTE    (ret) target status (see #0802)
  5048.  1Ah    DWORD    post routine address
  5049.  1Eh 34 BYTEs    workspace
  5050. ---request 05h---
  5051.  08h 16 BYTEs    host adapter-unique parameters
  5052. ---request 06h---
  5053.  08h    BYTE    target ID
  5054.  09h    BYTE    logical unit number
  5055.  0Ah    BYTE    disk drive flags (see #0804)
  5056.  0Bh    BYTE    INT 13h drive number
  5057.  0Ch    BYTE    preferred head number translation
  5058.  0Dh    BYTE    preferred sector size translation
  5059.  0Eh 10 BYTEs    reserved
  5060. SeeAlso: #0805
  5061.  
  5062. (Table 0799)
  5063. Values for ASPI request status:
  5064.  00h    not done yet
  5065.  01h    completed successfully
  5066.  02h    aborted by host
  5067.  04h    SCSI I/O error
  5068.  80h    invalid
  5069.  81h    no adapter
  5070.  82h    no device attached
  5071.  else    status
  5072. SeeAlso: #0798
  5073.  
  5074. Bitfields for ASPI request flags:
  5075. Bit(s)    Description    (Table 0800)
  5076.  0    posting enabled
  5077.  1    linking enabled
  5078.  2    residual byte length reported in Data Allocation Length field
  5079.  3    transfer from SCSI target to host
  5080.  4    transfer from host to SCSI target
  5081.  5    scatter/gather
  5082.  7-6    reserved
  5083. Note:    no data is transferred if both bits 3 and 4 are set; if neither is
  5084.       set, the direction is determined by the SCSI command
  5085. SeeAlso: #0798
  5086.  
  5087. Bitfields for ASPI extended features:
  5088. Bit(s)    Description    (Table 3301)
  5089.  0    scatter/gather supported
  5090.  1    residual byte length reported
  5091.  2    Wide SCSI 16 host adapter
  5092.  3    Wide SCSI 32 host adapter
  5093.  15-4    reserved
  5094. SeeAlso: #0798
  5095.  
  5096. (Table 0801)
  5097. Values for host adapter status:
  5098.  00h    no error detected
  5099.  11h    select timeout
  5100.  12h    data overrun
  5101.  13h    bus error
  5102.  14h    bus failure
  5103.  
  5104. (Table 0802)
  5105. Values for target status:
  5106.  00h    no status
  5107.  02h    sense data stored in SRB
  5108.  08h    target busy
  5109.  18h    reservation error
  5110.  
  5111. (Table 0803)
  5112. Values for device type:
  5113.  00h    disk drive
  5114.  01h    tape drive (streamer)
  5115.  02h    printer
  5116.  03h    processor
  5117.  04h    WORM drive
  5118.  05h    CD-ROM drive
  5119.  06h    scanner
  5120.  07h    optical drive
  5121.  08h    autochanger
  5122.  09h    communications device
  5123.  
  5124. (Table 0804)
  5125. Values for disk drive flags:
  5126.  00h    no INT 13 access
  5127.  01h    INT 13 with DOS access
  5128.  02h    INT 13 without DOS access
  5129.  03h    invalid flags
  5130.  
  5131. Format of CCB:
  5132. Offset    Size    Description    (Table 0805)
  5133.  00h    BYTE    command code (see #0806)
  5134.  01h    BYTE    flags
  5135.         bits 4-0: vary by function
  5136.         bits 7-5: logical unit number
  5137.  02h    BYTE    "adr_1"
  5138.  03h    BYTE    "adr_0"
  5139.  04h    BYTE    length
  5140.  05h    BYTE    control
  5141.     ...
  5142.  06h/0Ah 14 BYTEs buffer for sense data (see #0807)
  5143. SeeAlso: #0798
  5144.  
  5145. (Table 0806)
  5146. Values for CCB command code:
  5147.  00h    test unit ready
  5148.  01h    rewind
  5149.  03h    request sense data
  5150.  05h    get block size limits
  5151.  08h    Group 0 read
  5152.  0Ah    Group 0 write
  5153.  10h    write file marks
  5154.  11h    SCSI Space (set position?)
  5155.  12h    SCSI Inquire
  5156.  15h    set mode information
  5157.  16h    reserve SCSI device
  5158.  17h    release SCSI device
  5159.  19h    erase
  5160.  1Ah    request mode information
  5161.  1Bh    load/unload media
  5162.  1Dh    request target self-check
  5163.  24h    set window parameters
  5164.  25h    get window parameters
  5165.  28h    Group 1 read
  5166.  2Ah    Group 1 write
  5167.  31h    document feeder control
  5168.  34h    get scan data status
  5169. ---vendor-specific commands---
  5170.  D3h    get document feeder status
  5171.  D4h    set document feeder mode
  5172.  
  5173. Format of sense data:
  5174. Offset    Size    Description    (Table 0807)
  5175.  00h    BYTE    error code (bit 7 set if valid)
  5176.  01h    BYTE    segment number
  5177.  02h    BYTE    sense key
  5178.         bit 6: EOM
  5179.         bit 5: ILI
  5180.         bits 0-3: sense key (see #0808)
  5181.  03h  4 BYTEs    information bytes
  5182.  07h    BYTE    additional sense length (0Ah)
  5183.  08h  4 BYTEs    command-specific information
  5184.  0Ch    BYTE    additional sense code
  5185.  0Dh    BYTE    additional sense code qualifier
  5186.  0Eh    BYTE    field replaceable unit code
  5187.  0Fh  3 BYTEs    sense key specific bytes
  5188.  
  5189. (Table 0808)
  5190. Values for sense key:
  5191.  00h    no sense data
  5192.  02h    SCSI unit not ready
  5193.  03h    media error
  5194.  04h    unrecoverable hardware error
  5195.  05h    illegal parameter in CDB
  5196.  06h    target has been reset
  5197.  0Bh    target aborted command
  5198.  
  5199. (Table 3302)
  5200. Values APSI post function is called with:
  5201.     STACK:    DWORD -> SRB (see #0798) which completed
  5202.     interrupts disabled
  5203. Return: EBP, EBX, ESI, EDI must be preserved
  5204.     interrupts disabled
  5205. Note:    the post function may issue any APSI function except an abort; it
  5206.       should complete as quickly as possible
  5207. --------m-214402-----------------------------
  5208. INT 21 U - Qualitas 386MAX v6.00+ - IOCTL INPUT - GET STATE
  5209.     AX = 4402h
  5210.     BX = file handle for device "386MAX$$"
  5211.     CX = number of bytes to read
  5212.     DS:DX -> BYTE 03h followed by 386MAX state buffer (see #0809)
  5213. Return: CF clear if successful
  5214.         buffer at DS:DX+1 filled
  5215.         AX = number of bytes actually copied
  5216.     CF set on error
  5217.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  5218. Notes:    if the value given in CX is less than the size of the state record
  5219.       (5Ah for v6.01, 66h for v7.00), only a partial state record will be
  5220.       returned
  5221.     the state is 40h bytes for 386MAX (actually ASTEMM) v2.20 ("386MAX$$"
  5222.       did not exist yet, use "QMMXXXX0" and then "EMMXXXX0" instead) and
  5223.       56h bytes for v5.11.
  5224.     to invoke 386MAX API functions, push DX onto the stack, load DX with
  5225.       the word at offset 25h in the returned state, load all other
  5226.       registers as needed for the desired function, and execute an
  5227.       OUT DX,AL or OUT DX,AX; DX will be set to the pushed value on return
  5228.       if it is not otherwise modified by the API function.    For safety,
  5229.       in case a function is not supported or 386MAX is not present, SP
  5230.       should be saved and restored around the API call.
  5231.     Windows 3.1 Standard mode, LAN Manager, and Windows for Workgroups all
  5232.       use the 386MAX API; LAN Manager and Windows for Workgroups reportedly
  5233.       make some calls incorrectly
  5234. SeeAlso: AX=4403h/SF=03h"386MAX",INT 67/AH=3Fh
  5235.  
  5236. Format of 386MAX v6.01+ state:
  5237. Offset    Size    Description    (Table 0809)
  5238.  -1    BYTE    (call) 03h
  5239.  00h  6 BYTEs    signature "386MAX"
  5240.  06h  4 BYTEs    version string "N;NN" or "N.NN" (i.e. "6;01" for v6.01)
  5241.         (';' by default; apparently changed to a period when 386MAX
  5242.         has linked high RAM into DOS's memory chain)
  5243.  0Ah    WORD    segment of low-memory portion of 386MAX.SYS
  5244.  0Ch  2 BYTEs    ???
  5245.  0Eh    WORD    segment of ??? memory block or 0000h
  5246.  10h    WORD    bit flags 1 (see #0810)
  5247.  12h    WORD    starting address of video memory in KB
  5248.  14h  2 BYTEs    ???
  5249.  16h    WORD    total high DOS memory in KB
  5250.  18h  2 BYTEs    ???
  5251.  1Ah    WORD    available shared memory in KB
  5252.  1Ch    WORD    KBytes extended memory used by 386MAX
  5253.  1Eh  2 BYTEs    ???
  5254.  20h    WORD    total extended memory in KB
  5255.  22h    WORD    IO port to write (OUT DX,AL) to invoke 386MAX INT 15 functions
  5256.  24h    WORD    IO port to write (OUT DX,AL) to invoke 386MAX API functions
  5257.           (see #0823)
  5258.  26h    WORD    ??? (depends on DOS version)
  5259.  28h    WORD    size of ??? in paragraphs
  5260.  2Ah    DWORD    machine type (see #0818)
  5261.  2Eh    DWORD    -> first DOS memory control block
  5262.  32h    WORD    system configuration flags (see #0811)
  5263.  34h    WORD    debugging flags 1 (see #0812)
  5264.  36h    WORD    debugging flags 2 (see #0813)
  5265.  38h  2 BYTEs    ???
  5266.  3Ah    WORD    segment of first MCB in high memory chain
  5267.  3Ch    WORD    feature flags 1 (see #0815)
  5268.  3Eh    WORD    feature flags 2 (see #0816)
  5269.  40h    WORD    feature flags 3 (see #0817)
  5270.  42h    WORD    segment of first 386MAX control block??? (see #0819)
  5271.  44h    WORD    amount of memory to report available on INT 15/AH=88h
  5272.  46h  4 BYTEs    ???
  5273.  4Ah    WORD    number of K at start of address space swapped with fast
  5274.           extended memory (SWAP= parameter)
  5275.  4Ch  2 BYTEs    ???
  5276.  4Eh    WORD    segment address of ???
  5277.  50h    WORD    debugging flags 3 (see #0814)
  5278.  52h    DWORD    old INT 21h
  5279.  56h    DWORD    pointer to 386MAX's EMS (INT 67h) handler
  5280. ---386MAX v7.00---
  5281.  5Ah    DWORD    KB of extended memory managed by 386MAX
  5282.  5Eh    DWORD    bytes of extended memory (EXT= parameter)
  5283.  62h  4 BYTEs    ???
  5284.  
  5285. Bitfields for 386MAX bit flags 1:
  5286. Bit(s)    Description    (Table 0810)
  5287.  1    ???
  5288.  2    allow A20 to be enabled/disabled???
  5289.  3    ??? (cleared by calling INT 67 functions or starting MSWindows)
  5290.  4    high RAM present???
  5291.  5    386MAX in AUTO mode
  5292.  6    386MAX enabled
  5293.  7    386MAX is providing EMS services
  5294.  8    ??? (affects API function 08h)
  5295.  9    A20 gate closed (A20 disabled) (see INT 15/AX=2402h)
  5296.  10    Weitek support enabled
  5297.  11    ???
  5298.  12    ROMs not shadowed???
  5299.  13    QPMS has been used
  5300.  14    ???
  5301.  15    ???
  5302.  
  5303. Bitfields for 386MAX system configuration flags:
  5304. Bit(s)    Description    (Table 0811)
  5305.  1    ROM compressed???
  5306.  3    ???
  5307.  5    386MAX loaded into high memory
  5308.  6    Microchannel bus
  5309.  7    Weitek math coprocessor detected
  5310.  9    ??? (also generates INT 01 on ??? and INT 03 on ???)
  5311.  11    PC/XT (thus only single 8259 interrupt controller present, DMA only
  5312.         in 1st megabyte, etc)
  5313.  13    LMLTOP= specified
  5314.  14    enable A20 control???
  5315.  15    ???
  5316.  
  5317. Bitfields for 386MAX debugging flags 1:
  5318. Bit(s)    Description    (Table 0812)
  5319.  0    DEBUG=LED
  5320.  1    DEBUG=X67
  5321.  2    DEBUG=INV
  5322.  3    DEBUG=EMSPTED
  5323.  4    DEBUG=JMP
  5324.  5    DEBUG=CALL
  5325.  6    DEBUG=HLT
  5326.  7    DEBUG=PMR
  5327.  8    DEBUG=CR3
  5328.  9    DEBUG=CAPS or DEBUG=INT
  5329.  10    DEBUG=RC
  5330.  11    DEBUG=ROM
  5331.  12    DEBUG=XM
  5332.  13    DEBUG=SOR
  5333.  14    DEBUG=XR
  5334.  15    DEBUG=EMSERR (generate INT 01 on returning error from EMS call)
  5335.  
  5336. Bitfields for 386MAX debugging flags 2:
  5337. Bit(s)    Description    (Table 0813)
  5338.  0    DEBUG=ROMSWAP
  5339.  1    DEBUG=UNSHADOWROM
  5340.  2    DEBUG=COMPROM
  5341.  3    DEBUG=DPMIPHYS
  5342.  4    DEBUG=ALLROM
  5343.  5    DEBUG=VMS
  5344.  6    DEBUG=XMS (generate INT 01 on XMS calls)
  5345.  7    DEBUG=I06
  5346.  8    DEBUG=VCPI
  5347.  9    DEBUG=XDMA
  5348.  10    DEBUG=X09
  5349.  13    DEBUG=I67 (generate INT 01 on every INT 67 call)
  5350.  14    DEBUG=EVM (generate INT 01 on entering V86 mode)
  5351.  15    DEBUG=EMSSAVE or DEBUG=VDS
  5352.  
  5353. Bitfields for 386MAX debugging flags 3:
  5354. Bit(s)    Description    (Table 0814)
  5355.  10    DEBUG=EPM
  5356.  12    DEBUG=ABIOS
  5357.  13    DEBUG=XMSPTED
  5358.  14    DEBUG=TIME
  5359.  15    DEBUG=SCRUB
  5360.  
  5361. Bitfields for 386MAX feature flags 1:
  5362. Bit(s)    Description    (Table 0815)
  5363.  1    Weitek present
  5364.  2    no DPMI services
  5365.  3    NODMA
  5366.  4    TERSE
  5367.  5    NOROM
  5368.  6    NOPARITY
  5369.  8    NOFLEX (IGNOREFLEXFRAME)
  5370.  11    don't create UMBs
  5371.  12    don't backfill below video memory (NOLOW)
  5372.  13    FRAME= specified
  5373.  14    EXT= specified
  5374.  15    NOEMS, allow prior expanded memory manager to provide EMS
  5375.  
  5376. Bitfields for 386MAX feature flags 2:
  5377. Bit(s)    Description    (Table 0816)
  5378.  0    UNSHIFT specified (FORCEA20 disabled)
  5379.  1    NOXRAM
  5380.  2    NOSCSI specified
  5381.  3    SCREEN specified
  5382.  4    enabled EISADMA
  5383.  5    slow DMA
  5384.  6    RESETKEYB specified
  5385.  7    ???
  5386.  9    TOP384
  5387.  10    ???
  5388.  11    NOWARMBOOT
  5389.  12    USE= specified
  5390.  13    ROM= specified
  5391.  
  5392. Bitfields for 386MAX feature flags 3:
  5393. Bit(s)    Description    (Table 0817)
  5394.  0    Windows3 support enabled
  5395.  1    SHADOWROM
  5396.  2    don't compress ROM (NOCOMPROM)
  5397.  3    ??? (related to PRGREG=)
  5398.  4    ??? (related to PRGREG=)
  5399.  5    SHADOWRAM
  5400.  6    DOS4 specified
  5401.  7    NOLOADHIGH
  5402.  8    NOPULSE
  5403.  11    FORCEA20
  5404.  12    DMA buffer enabled
  5405.  13    NOSCRUB
  5406.  15    NOFRAME
  5407.  
  5408. Bitfields for 386MAX machine type:
  5409. Bit(s)    Description    (Table 0818)
  5410.  12    Amstrad
  5411.  13    Epson
  5412.  14    Zenith Data Systems
  5413.  15    "ASEM"
  5414.  16    NEC
  5415.  17    "HPRS" model codes 69h and 6Ah
  5416.  18    Dell
  5417.  19    "CA"
  5418.  20    ITT (Xtra Business Systems/Alcatel)
  5419.  21    Toshiba 5100
  5420.  22    Olivetti
  5421.  23    Quadram Quad386 (BIOS model FEh, submodel A6h)
  5422.  24    Tandy???
  5423.  25    AST 386
  5424.  26    INBOARD, ??? version
  5425.  27    INBOARD, ??? version
  5426.  28    INBOARD, ??? version
  5427.  29    "HPRS"
  5428.  30    Compaq 386
  5429.  31    JET386
  5430.  
  5431. Format of 386MAX control block:
  5432. Offset    Size    Description    (Table 0819)
  5433.  00h    WORD    segment of next block (FFFFh if last)
  5434.  02h    WORD    segment of previous block (FFFFh if first)
  5435.  04h 12 BYTEs    filename
  5436.  10h    WORD    resident size in paragraphs
  5437.  12h    WORD    environment size???
  5438.  14h    WORD    real prsent environment size + 1 (0000h if ENVSAVE used)
  5439.  16h  2 BYTEs    ???
  5440.  18h    DWORD    initial size or SIZE=n in 386LOAD commandline
  5441.  1Ch    DWORD    SIZE=-1 ???
  5442.  20h    DWORD    SIZE= ???
  5443.  24h    BYTE    PRGREG= if specified, else FFh
  5444.  25h    BYTE    ENVREG= if specified, else FFh
  5445.  26h    BYTE    FlexFrame (00h not present, 01h present)
  5446.  27h  3 BYTEs    ???
  5447.  2Ah    BYTE    GROUP= or 00h if not present
  5448.  2Bh    BYTE    ???
  5449.  2Ch    WORD    PSP
  5450.  
  5451. Format of 386MAX high memory info record:
  5452. Offset    Size    Description    (Table 0820)
  5453.  00h    WORD    segment address of memory region
  5454.  02h    WORD    size of memory region in paragraphs
  5455.  04h    BYTE    type or flags???
  5456.         00h if locked out
  5457.         02h if EMS page frame
  5458.         04h if high RAM
  5459.         42h if ROM
  5460.  05h    BYTE    ???
  5461.  
  5462. Format of 386MAX ROM shadowing record:
  5463. Offset    Size    Description    (Table 0821)
  5464.  00h    WORD    logical start segment of ROM??? (may be used by BlueMAX when it
  5465.           squeezes together the ROMs to make room)
  5466.  02h    WORD    physical start segment of ROM
  5467.  04h  2 BYTEs    ???
  5468.  06h    WORD    size of shadowed ROM in paragraphs
  5469.  08h  2 BYTEs    ???
  5470.  0Ah    WORD    flags
  5471.         bit 15: shadowing enabled for this ROM???
  5472.         bit 14: ???
  5473.         bit 13: ???
  5474.         bit 12: ???
  5475.         bit 10: ???
  5476.  
  5477. (Table 0822)
  5478. Values for 386MAX memory type:
  5479.  00h    unused by EMS
  5480.  01h    DOS
  5481.  04h    page frame overlapping ROM???
  5482.  80h    high memory
  5483.  84h    page frame???
  5484.  87h    video ROM???
  5485. Note:    the type may be 00h (unused) if the 16K page is split among different
  5486.       uses (such as ROM and high RAM)
  5487.  
  5488. (Table 0823)
  5489. Call 386MAX API (via OUT DX,AL) with:
  5490.     STACK: WORD value for DX
  5491.     AH = 00h unused
  5492.         Return: AH = 84h (unsupported function)
  5493.     AH = 01h get high memory information
  5494.         ES:DI -> buffer for array of high memory info records
  5495.             (see #0820)
  5496.         Return: CX = number of records placed in buffer
  5497.     AH = 02h get shadowed ROM info
  5498.         ES:DI -> buffer for array of ROM shadowing records (see #0821)
  5499.         Return: CX = number of records placed in buffer
  5500.     AH = 03h get 386MAX state
  5501.         ES:DI -> 90-byte buffer for state (see #0809)
  5502.         Return: AH = 00h (successful)
  5503.             buffer filled
  5504.     AH = 04h get memory types???
  5505.         ES:DI -> buffer for memory type info (array of bytes, one per
  5506.             16K page) (see #0822)
  5507.         Return:    CX = number of bytes placed in buffer
  5508.     AH = 05h get page table entries
  5509.         AL = A20 control (00h enable A20 first, 01h leave unchanged)
  5510.         CX = buffer size in bytes (0000h = enough for all memory from
  5511.             given start to end of memory managed by 386MAX)
  5512.         SI = first K to report (rounded down to 4K page)
  5513.         ES:DI -> buffer for returned page table entries
  5514.         Return: CX = number of bytes returned (four per 4K page)
  5515.             ES:DI buffer filled
  5516.     AH = 06h get memory speed info
  5517.         ES:DI -> buffer for memory speed records (see #0824)
  5518.         Return: AH = 00h (successful)
  5519.             CX = number of bytes placed in buffer
  5520.         Note:    this function can take over a second to execute
  5521.     AH = 07h map/unmap multiple handle pages
  5522.         DX = EMS handle (on stack)
  5523.         STACK: DWORD -> EMS mapping record
  5524.         Return:    AH = status (00h,80h,83h,8Ah,8Bh)
  5525.         Format of EMS mapping record:
  5526.         Offset    Size    Description
  5527.          00h    WORD    function
  5528.                 0000h use physical page numbers
  5529.                 0001h use segment addresses
  5530.          02h    WORD    EMS handle
  5531.          04h    WORD    number of mapping entries following
  5532.          06h 2N WORDs    logical page number and physical page/segment
  5533.                 logical page FFFFh means unmap physical page
  5534.         SeeAlso: INT 67/AH=50h
  5535.     AH = 08h "EMM2_GOREAL" check whether possible to disable 386MAX
  5536.         AL = ??? (00h or nonzero)
  5537.         Return: AH = status (00h OK, A4h not possible at this time)
  5538.         Note:    if AL=00h, this function always returns success
  5539.     AH = 09h toggle Bit Flags 1 flags
  5540.         BX = bitmask of bit flags 1's flags to toggle (see #0810)
  5541.         Return: AH = 00h (successful)
  5542.         Note:    enables A20 first
  5543.     AH = 0Ah toggle Debugging Flags 1 flags
  5544.         BX = bitmask of Debugging Flags 1's bits to toggle (see #0812)
  5545.         Return: AH = 00h (successful)
  5546.         Notes:    enables A20 first
  5547.             does ??? if bit 3 on after specified bits are toggled
  5548.     AH = 0Bh toggle Debugging Flags 2 flags
  5549.         BX = bitmask of Debugging Flags 2's bits to toggle (see #0813)
  5550.         Return: AH = 00h (successful)
  5551.         Note:    enables A20 first
  5552.     AH = 0Ch toggle feature flags 3
  5553.         BX = bitmask of feature flags 3's bits to toggle (see #0817)
  5554.         Return: AH = 00h (successful)
  5555.         Note:    enables A20 first
  5556.     AH = 0Dh specify 386MAX high-memory location
  5557.         BX = segment address of high-memory real-mode portion of 386MAX
  5558.         CX = current segment of real-mode stub???
  5559.         Return: AH = status (00h successful)
  5560.             ???
  5561.     AH = 0Eh CRT controller register virtualization
  5562.         AL = subfunction
  5563.             00h allow access to CRTC I/O ports 03B4h/03B5h, 03D4h/03D5h
  5564.             01h trap accesses to CRTC I/O ports
  5565.     AH = 0Fh reboot system
  5566.         Return: never
  5567.     AH = 10h unused
  5568.         Return: AH = 84h (unsupported function)
  5569.     AH = 11h get high memory information
  5570.         ES:DI -> 96-byte buffer for high memory info
  5571.         Return: AH = 00h (successful)
  5572.             ES:DI buffer filled
  5573.         Notes:    each byte in buffer contains bit flags for a 4K page in
  5574.               the A000h-FFFFh region
  5575.                 bit 0: page is writeable
  5576.                 bit 1: physical address same as linear address
  5577.                 bit 2: EMS page frame
  5578.                 bit 6: page is part of the QPMS window
  5579.             this function can take over a second to execute,
  5580.               because it does a 128K read for each page in an
  5581.               attempt to flush any RAM cache the system may have
  5582.     AH = 12h shadow RAM mapping
  5583.         AL = subfunction
  5584.             00h unshadow ROMs (except page FFh if NOWARMBOOT set)
  5585.             01h map shadow RAM into ROM regions???
  5586.         Return: AH = 00h (successful) if AL=00h or 01h
  5587.             AH = 8Fh otherwise
  5588.     AH = 13h shadow RAM page protection
  5589.         AL = subfunction
  5590.             00h set all shadowed ROM 4K pages to read-only
  5591.             01h set all shadowed ROM 4K pages to read-write
  5592.         Return: AH = 00h (successful) if AL=00h or 01h
  5593.             AH = 8Fh otherwise
  5594.     AH = 14h get Programmable Option Select info???
  5595.         ES:DI -> 54-byte buffer for POS data???
  5596.         Return: AH = 00h if successful
  5597.             AH = A4h on error
  5598.         Note:    the buffer consists of nine 6-byte fields; the first
  5599.               eight for slots 1-8, the last for the system board
  5600.     AH = 15h ???
  5601.         ???
  5602.         Return: ???
  5603.     AH = 16h get 386MAX memory usage screen
  5604.         ES:DI -> buffer for memory info display
  5605.         CX = size of buffer in bytes
  5606.         Return:    ES:DI buffer filled with '$'-terminated string (if
  5607.                 large enough to hold entire usage screen)
  5608.         Note:    the screen is 0303h bytes in v7.00
  5609.     AH = 17h Windows 3 startup/termination
  5610.         AL = subfunction
  5611.             00h Windows3 initializing
  5612.             DX (on stack) = Windows startup flags
  5613.             DI = Windows version number (major in upper byte)
  5614.             ES:BX = 0000h:0000h
  5615.             DS:SI = 0000h:0000h
  5616.             Return: CX = 0000h if OK for Windows to load
  5617.                    <> 0 if Windows should not load
  5618.                 ES:BX -> startup info structure
  5619.                 DS:SI -> Virtual86 mode enable/disable callback
  5620.             01h Windows3 terminating
  5621.             ES:BX -> ???
  5622.             DX (on stack) = Windows exit flags
  5623.             Return: ???
  5624.     AH = 18h QPMS (Qualitas Protected Memory Services)
  5625.         AL = subfunction
  5626.             00h get QPMS configuration
  5627.             Return: BX = starting segment of QPMS memory window
  5628.                 CX = number of 4K pages reserved for QPMS???
  5629.                 DX = number of 4K pages in QPMS window???
  5630.             01h map QPMS memory page???
  5631.             BX = 4K page number within memory reserved for QPMS???
  5632.             CL = 4K page number within QPMS memory window???
  5633.             02h mark all QPMS memory read-only
  5634.             03h mark all QPMS memory read-write
  5635.         Return: AH = status (00h,8Ah,8Bh,8Fh)
  5636.     AH = 19h get linear address for physical address
  5637.         EDX = physical address (low word on stack)
  5638.         Return: AH = status
  5639.                 00h successful
  5640.                 EDX = linear address at which physical address
  5641.                     may be accessed
  5642.                 8Bh physical address currently not addressable
  5643.         Note:    enables A20 first
  5644.     AH = 1Ah set page table entry
  5645.         EDX = new page table entry (low word on stack)
  5646.         ESI = linear address of page to map (bits 0-11 clear)
  5647.         Return: AH = status (00h,8Bh)
  5648.         Note:    enables A20 first
  5649.     AH = 1Bh get ???
  5650.         Return: AH = status
  5651.             BX = ???
  5652.             CX = number of ???
  5653.             EDX = physical address of ???
  5654.     AH = 1Ch get original interrupt vector
  5655.         AL = interrupt vector (00h-7Fh)
  5656.         Return: AH = 00h (successful)
  5657.             EDX = original vector before 386MAX loaded (segment in
  5658.                 high word, offset in low word)
  5659.         Note:    no range checking is performed; requests for INTs 80h-
  5660.               FFh will return random values
  5661.     AH = 1Dh display string???
  5662.         SI = ???
  5663.         Return: AH = 00h (successful)
  5664.             ???
  5665.         Note:    this function appears to be broken in v7.00
  5666.     AH = 1Eh get memory info
  5667.         ES:DI -> memory info (see #0825)
  5668.         Return: ???
  5669.     AH = 1Fh get DPMI host information
  5670.         Return: AX = 0000h if successful
  5671.             BX = DPMI flags (see #2407 at INT 31/AX=0400h)
  5672.             CL = CPU type (02h = 80286, 03h = 80386, etc.)
  5673.             DX = DPMI ver supported (DH=major, DL=2-digit minor)
  5674.             SI = ???
  5675.             ES???:DI -> ???
  5676.         Note:    NOP if NODPMI switch specified
  5677.     AH = 20h (v7.00) get ???
  5678.         AL = index of ???
  5679.         Return: EDX = ??? for specified ???
  5680.     AH = 21h (v7.00) STACKS support
  5681.         AL = 00h get STACKS parameters
  5682.         Return: BX = ??? (0060h for v7.00)
  5683.             CX = number of stacks for hardware interrupts
  5684.             DX = size of each stack in bytes
  5685.             SI = ??? (low and high bytes are separate values)
  5686.             DI = ??? (low and high bytes are separate values)
  5687.                 low byte = logical page number set by subfn 02h
  5688.             ES = ???
  5689.         AL = 01h set ??? "EMM2_DSTKS"
  5690.         EBX = ???
  5691.         ECX = ???
  5692.         AL = 02h set ???
  5693.         BL = logical page number for ??? (00h-03h)
  5694.         Return: AH = status (00h,8Ah)
  5695.     AH = 22h (v7.00) call ??? for every load module
  5696.         AL = which function to call
  5697.         00h call ???
  5698.         else call ????
  5699.         Return: AH = 00h
  5700.         Note: if AL=00h, calls the protected-mode function pointed at by
  5701.         the DWORD at offset 22h from the start of each module installed
  5702.         by a LOAD= directive; if AL<>00h, it calls the function
  5703.         pointed at by the DWORD at offset 28h of the load module
  5704.     AH = 23h (v7.00) ???
  5705.         AL = 00h set ???
  5706.         BL = ???
  5707.         Return:    AH = 00h or unchanged (depending on ???)
  5708.         AL = 01h set ???
  5709.         BL = ???
  5710.         BH = ???
  5711.         CX = ???
  5712.         DX = ??? (on top of stack)
  5713.         Return: AH = status (00h if successful, 8Fh once table full)
  5714.         Note:    this call adds one entry to an internal table on each
  5715.               call, until the table is full
  5716.         AL = 02h get ???
  5717.         CX = size of buffer
  5718.         ES:DI -> buffer for ??? (60 bytes total data)
  5719.         Return: CX = number of bytes actually returned
  5720.         Note:    returns the array storing the values set with AX=2301h
  5721.         Format of one entry in array:
  5722.         Offset    Size    Description
  5723.          00h    BYTE    ??? (BL from subfn 01h)
  5724.          01h    WORD    ??? (CX from subfn 01h)
  5725.          03h    BYTE    ??? (BH from subfn 01h)
  5726.          04h    WORD    ??? (DX from subfn 01h)
  5727.         AL = 03h set ??? name/path
  5728.         ES:DI -> buffer containing ASCIZ ???
  5729.         AL = 04h get ???
  5730.         ES:DI -> buffer for ASCIZ ???
  5731.         Note: the ASCIZ string for subfunctions 03h and 04h does not appear
  5732.         to be used by 386MAX, and may serve merely for communication
  5733.         between two other Qualitas programs
  5734.     AH = 24h (v7.00) high memory control
  5735.         AL = 00h get high memory state
  5736.         Return: BX = current state
  5737.                 00h high memory removed from DOS memory chain
  5738.                 01h high memory included in DOS memory chain
  5739.         AL = 01h set high memory state
  5740.         BX = new state
  5741.             00h high memory removed from DOS memory chain
  5742.             01h high memory included in DOS memory chain
  5743.             else
  5744.             Return: ??? (error, but return varies according to ???)
  5745.     AH = 25h (v7.00) remove high RAM from DOS memory chain
  5746.     AH = 26h (v7.00) ???
  5747.         BX = ???
  5748.         CX = ???
  5749.         SI = ???
  5750.         DI = ???
  5751.         Return: AH = status
  5752.             BX = ???
  5753.             CX = ???
  5754.     AH = 27h (v7.00) ???
  5755.         AL = 00h get ???
  5756.         Return: BX = number of paragraphs for ???
  5757.         AL = 01h ???
  5758.         BX = ???
  5759.         ES??? = ???
  5760.         AL = 02h ???
  5761.         ???
  5762.         AL = 03h ???
  5763.         CX = ???
  5764.         DX = ???
  5765.         ES??? = ???
  5766.         Return: ???
  5767.     AH = 28h (v7.00) get ???
  5768.         Return: AH = status (00h,8Fh) (see #2897 at INT 67/AH=40h)
  5769.             if AH=00h,
  5770.                 CX = ???
  5771.                 DX = ???
  5772.     AH = 29h (v7.00) get ???
  5773.         Return: AX = ???
  5774.     AH = 40h-5Dh EMS services (see INT 67/AH=40h, etc.)
  5775.     AH = DEh VCPI services (see INT 67/AX=DE00h, etc.)
  5776. Return: AH = status (as for EMS INT 67 calls)
  5777.         00h successful
  5778.         80h internal error
  5779.         81h hardware malfunction
  5780.         83h invalid handle
  5781.         84h    undefined function
  5782.         8Ah invalid logical page nuber
  5783.         8Bh illegal physical page number
  5784.         8Fh undefined subfunction
  5785.         A4h access denied
  5786.         etc.
  5787.     STACK popped (value placed in DX if no specific return value for DX)
  5788.  
  5789. Format of 386MAX memory speed record:
  5790. Offset    Size    Description    (Table 0824)
  5791.  00h    DWORD    page table entry for 4K page
  5792.  04h    WORD    number of microticks (840ns units) required for REP LODSD of
  5793.           entire 4K page
  5794.  
  5795. Format of 386MAX memory info [array]:
  5796. Offset    Size    Description    (Table 0825)
  5797.  00h    DWORD    linear start address
  5798.  04h    DWORD    size in bytes
  5799.  08h    WORD    XMS handle (if next byte = 04h)
  5800.         ??? (if next byte = 05h)
  5801.         ??? (if next byte = 06h)
  5802.         ??? (if next byte = 13h)
  5803.         ??? (if next byte = 14h)
  5804.         ??? (if next byte = 15h)
  5805.         ??? (if next byte = 23h)
  5806.         ??? (if next byte = 24h)
  5807.         ??? (if next byte = 26h)
  5808.         else unused
  5809.  0Ah    BYTE    type
  5810.         00h = ???, 01h = VDISK,
  5811.         02h = INT 15h extended memory, 03h = ??? extended,
  5812.         04h = XMS handle's memory, 05h = ???, 06h = ???, 07h = ???,
  5813.         08h = ???, 09h = ???, 0Ah = ???, 0Bh = ???,
  5814.         11h = ???, 12h = ???, 14h = ???, 15h = ???,
  5815.         19h = ???, 1Ah = ???, 1Bh = ???,
  5816.         1Ch = ???, 1Dh = ???, 1Eh = ???, 1Fh = ???,
  5817.         20h = ???, 21h = ???, 23h = ???, 24h = ???,
  5818.         26h = ???
  5819.  0Bh    BYTE    ??? (00h for types 00h-03h, 07h-0Bh, 19h-21h;
  5820.              80h for types 04h/13h-15h/23h-26h;
  5821.             ??? for type 05h)
  5822. --------V-214402-----------------------------
  5823. INT 21 - PGS1600.DEV - IOCTL - GET CONFIGURATION INFO
  5824.     AX = 4402h
  5825.     BX = file handle for device "PGS1600$"
  5826.     CX = 0018h (size of buffer)
  5827.     DS:DX -> configuration buffer (see #0826)
  5828. Return: CF clear if successful
  5829.         buffer filled
  5830.         AX = number of bytes actually copied
  5831.     CF set on error
  5832.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  5833. Program: PGS1600.DEV is a device driver for the Cornerstone Technology PG1600
  5834.       display adapter, which provides a 1600x1200 monochrome display as
  5835.       well as one of two emulations, MDA or CGA.
  5836. SeeAlso: AX=4403h"PGS1600"
  5837.  
  5838. Format of PGS1600.DEV configuration information:
  5839. Offset    Size    Description    (Table 0826)
  5840.  00h    WORD    version (high byte = major, low byte = minor)
  5841.  02h    WORD    board initialisation mode
  5842.  04h    WORD    board I/O address
  5843.         03D0h CGA emulation
  5844.         03B0h MDA emulation
  5845.         0390h no emulation
  5846.         0350h no emulation, alternate
  5847.  06h    WORD    emulation buffer segment
  5848.         B800h    CGA emulation
  5849.         B000h    MDA emulation
  5850.         0000h    no emulation
  5851.  08h    WORD    PG1600 graphics buffer segment
  5852.  0Ah    WORD    number of bytes between consecutive graphic rows
  5853.  0Ch    WORD    horizontal pixel size
  5854.  0Eh    WORD    vertical pixel size
  5855.  10h    WORD    horizontal dots per inch
  5856.  12h    WORD    vertical dots per inch
  5857.  14h    WORD    graphics buffer bits per pixel
  5858.  16h    WORD    monitor bits per pixel
  5859. --------N-214402-----------------------------
  5860. INT 21 - PC/TCP IPCUST.SYS - RESET CONFIGURATION DATA READ POINTER
  5861.     AX = 4402h
  5862.     BX = file handle referencing device "$IPCUST"
  5863.     CX, DS:DX ignored
  5864. Return: CF clear if successful
  5865.         AX destroyed
  5866.     CF set on error
  5867.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  5868. Notes:    there are a total of 378h bytes of configuration data for IPCUST.SYS
  5869.       version 2.05.     If less than the entire data is read or written,
  5870.       the next read/write continues where the previous one ended; this
  5871.       call and AX=4403h both reset the location at which the next
  5872.       operation starts to zero
  5873.     v2.1+ uses a new configuration method, but allows the installation
  5874.       of IPCUST.SYS for backward compatibility with other software which
  5875.       must read the PC/TCP configuration
  5876. SeeAlso: AH=3Fh"IPCUST",AH=40h"IPCUST",AX=4403h"IPCUST"
  5877. --------N-214402-----------------------------
  5878. INT 21 - WORKGRP.SYS - GET API ENTRY POINT
  5879.     AX = 4402h
  5880.     BX = file handle for device "NET$HLP$"
  5881.     CX = 0008h
  5882.     DS:DX -> buffer for entry point record (see #0827)
  5883. Return: CF clear if successful
  5884.         AX = number of bytes actually read
  5885.     CF set on error
  5886.         AX = error code
  5887. Program: WORKGRP.SYS is the portion of Microsoft's Workgroup Connection which
  5888.       permits communication with PCs running Windows for Workgroups or
  5889.       LAN Manager
  5890. SeeAlso: AH=3Fh"WORKGRP.SYS"
  5891.  
  5892. Format of WORKGRP.SYS entry point record:
  5893. Offset    Size    Description    (Table 0827)
  5894.  00h    WORD    3633h  \ signature???
  5895.  02h    WORD    EF6Fh  /
  5896.  04h    DWORD    address of entry point (see #0828)
  5897. Note:    first four bytes of buffer must be 6Fh E9h 33h 36h on entry when using
  5898.       IOCTL rather than READ to get the entry point record
  5899.  
  5900. (Table 0828)
  5901. Call WORKGRP entry point with:
  5902.     STACK:    WORD    function number (0000h-0009h)
  5903. Return: STACK unchanged
  5904. SeeAlso: #0829,#0830,#0831,#0832,#0833,#0834,#0835,#0836
  5905.  
  5906. (Table 0829)
  5907. Call WORKGRP function 00h with:
  5908.     STACK:    WORD    0000h (function "get ???")
  5909. Return: DX:AX -> data table
  5910.  
  5911. (Table 0830)
  5912. Call WORKGRP function 01h with:
  5913.     STACK:    WORD    0001h (function "hook ???")
  5914. Return: STACK:    DWORD    pointer to ???
  5915.         WORD    0001h (function number)
  5916.  
  5917. (Table 0831)
  5918. Call WORKGRP function 02h with:
  5919.     STACK:    WORD    0002h (function "unhook ???")
  5920.     ???
  5921. Return: ???
  5922.  
  5923. (Table 0832)
  5924. Call WORKGRP function 03h with:
  5925.     STACK:    WORD    0003h (function "reenable printer port")
  5926.         WORD    LPT port number
  5927. Return: ???
  5928.  
  5929. (Table 0833)
  5930. Call WORKGRP function 04h with:
  5931.     STACK:    WORD    0004h (function "disable printer port")
  5932.         WORD    LPT port number
  5933. Return: ???
  5934.  
  5935. (Table 0834)
  5936. Call WORKGRP function 05h with:
  5937.     STACK:    WORD    0005h (function "???")
  5938.         ???
  5939. Return: ???
  5940.  
  5941. (Table 0835)
  5942. Call WORKGRP function 06h with:
  5943.     STACK:    WORD    0006h (function "???")
  5944. Return: STACK unchanged
  5945.     AX = 0000h
  5946.     DX = 0000h
  5947.  
  5948. (Table 0836)
  5949. Call WORKGRP functions 07h-09h with:
  5950.     STACK:    WORD    0007h-0009h (NOP functions)
  5951. Return: STACK unchanged
  5952.     AX = 0001h
  5953.     DX = 0000h
  5954. --------N-214402-----------------------------
  5955. INT 21 - 10NET v5.0 - 10BEUI.DOS - API
  5956.     AX = 4402h
  5957.     BX = file handle referencing device "10BEUI$"
  5958.     DS:DX -> parameter record (see #0837)
  5959.     CX ignored
  5960. Return: CF clear if successful
  5961.         AX destroyed
  5962.     CF set on error
  5963.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  5964. SeeAlso: AX=4402h"10MEMMGR",INT 6F/AH=00h"10NET"
  5965.  
  5966. Format of 10NET 10BEUI.DOS parameter record:
  5967. Offset    Size    Description    (Table 0837)
  5968.  00h    WORD    000Ah (function number???)
  5969.  02h    WORD    ???
  5970.  04h    DWORD    pointer to buffer for ???
  5971.  08h  4 BYTEs    ???
  5972.  0Ch    WORD    transfer size
  5973. --------N-214402-----------------------------
  5974. INT 21 - 10NET v5.0 - 10MEMMGR.SYS - API
  5975.     AX = 4402h
  5976.     BX = file handle referencing device "MEMMGR0$"
  5977.     DS:DX -> 6-byte buffer for interface info (see #0838)
  5978.     CX ignored
  5979. Return: CF clear if successful
  5980.         AX destroyed
  5981.     CF set on error
  5982.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  5983. SeeAlso: AX=4402h"10BEUI",INT 6F/AH=00h"10NET"
  5984.  
  5985. Format of 10NET 10MEMMGR.SYS interface info:
  5986. Offset    Size    Description    (Table 0838)
  5987.  00h    DWORD    address of entry point (see #0839)
  5988.  04h    WORD    version (0500h for v5.00)
  5989.  
  5990. (Table 0839)
  5991. Call 10NET 10MEMMGR.SYS entry point with:
  5992.     AL = 01h ???
  5993.         BX = ???
  5994.         Return: CF clear if successful
  5995.             CF set on error
  5996.             AX = error code
  5997.     AL = 02h ???
  5998.         ???
  5999.     AL = 03h ???
  6000.         ???
  6001.     AL = 04h set/restore memory allocation strategy
  6002.         BX = subfunction
  6003.         0000h set strategy
  6004.         0001h restore strategy
  6005.         Return: CF clear if successful
  6006.             CF set on error (if function disabled)
  6007.             various registers destroyed
  6008.     AL = other
  6009.         Return: CF set
  6010.             AX = 0000h
  6011.             BL = 01h
  6012. --------V-214402-----------------------------
  6013. INT 21 - Compaq AG1024.SYS - RGDI - GET DRIVER LOCATION
  6014.     AX = 4402h
  6015.     BX = file handle for device "$$$$RGDI"
  6016.     CX = 0006h (size of returned data)
  6017.     DS:DX -> location record (see #0840)
  6018. Return: CF clear if successful
  6019.         buffer filled
  6020.     CF set on error
  6021.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6022. Program: AG1024.SYS is a device driver for the Advanced Graphics 1024 adapter
  6023. SeeAlso: AX=4403h"RGDI"
  6024.  
  6025. Format of Compaq AG1024.SYS location record:
  6026. Offset    Size    Description    (Table 0840)
  6027.  00h    WORD    signature 55AAh
  6028.  02h    WORD    segment of ???
  6029.  04h    WORD    segment of device driver's code
  6030. --------N-214402-----------------------------
  6031. INT 21 - FTPSOFT.DOS v3.1 - GET ???
  6032.     AX = 4402h
  6033.     BX = file handle for device "FTPSOFT$"
  6034.     CX = size of buffer
  6035.     DS:DX -> buffer for data (see #0841)
  6036. Return: CF clear if successful
  6037.         buffer filled
  6038.     CF set on error
  6039.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6040. Program: FTPSOFT.DOS is a device driver for Protocol Manager support from
  6041.        FTP Software, Inc.
  6042. SeeAlso: AH=3Fh"PC/TCP",AX=4402h"NDIS"
  6043.  
  6044. Format of FTPSOFT.DOS data:
  6045. Offset    Size    Description    (Table 0841)
  6046.  00h    WORD    (call) BA98h (if different, no data returned)
  6047.  02h    DWORD    -> NDIS common characteristics table
  6048.           (see #0780 at AX=4402h"NDIS")
  6049.  06h    DWORD    (call) -> new dispatch table (see #0782 at AX=4402h"NDIS")
  6050.  0Ah    DWORD    -> 28-byte buffer for ??? data
  6051.  0Eh    DWORD    ???
  6052.  12h    DWORD    -> FAR function to reset dispatch jump table to defaults
  6053.  16h    BYTE    ???
  6054. Note:    the addresses in the new dispatch table are copied into an internal
  6055.       jump table which may be reset by calling the function pointed at by
  6056.       offset 12h
  6057. --------n-214402-----------------------------
  6058. INT 21 U - PenDOS PENDEV.SYS - GET ENTRY POINTS
  6059.     AX = 4402h
  6060.     BX = file handle for device "$$PENDOS" or "$$PD_REG"
  6061.     CX = size of buffer (4 for $$PENDOS and a 4,8,12, or 16 for $$PD_REG)
  6062.     DS:DX -> buffer for entry point record (see #0842)
  6063. Return: CF clear if successful
  6064.         buffer filled
  6065.     CF set on error
  6066.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6067. Program: A limited version of PenDOS by Communication Intelligence Corporation,
  6068.       which provides pen capability to keyboard-based programs, is bundled
  6069.       with IBM DOS 6.1
  6070. SeeAlso: AX=4403h"PENDEV.SYS"
  6071.  
  6072. Format of PENDEV.SYS entry point record:
  6073. Offset    Size    Description    (Table 0842)
  6074.  00h    DWORD    -> array of jumps
  6075.  04h    WORD    offset of function to retrieve entry point (see #0843)
  6076.  06h  2 BYTEs    signature "Pe"
  6077.  08h    WORD    offset of function to set entry point (see #0844)
  6078.  0Ah  2 BYTEs    signature "nD"
  6079.  0Ch    WORD    offset of function to clear entry point (see #0845)
  6080.  0Eh    WORD    signature "OS"
  6081.  
  6082. (Table 0843)
  6083. Call PENDEV.SYS function to retrieve entry point with:
  6084.     AX = index of entry point (0-9)
  6085. Return: CF clear if successful
  6086.         DX:AX -> desired entry point
  6087.     CF set on error (AX out of range)
  6088.  
  6089. (Table 0844)
  6090. Call PENDEV.SYS function to set entry point with:
  6091.     AX = index of entry point (0-9)
  6092.     DX:SI -> new handler
  6093. Return: CF clear if successful
  6094.     CF set on error (AX out of range)
  6095.  
  6096. (Table 0845)
  6097. Call PENDEV.SYS function to clear entry point with:
  6098.     AX = index of entry point (0-9)
  6099. Return: CF clear if successful
  6100.     CF set on error (AX out of range)
  6101. Note:    resets the jump at the specified entry point to its default target,
  6102.       which simply returns
  6103. --------N-214402-----------------------------
  6104. INT 21 U - LAN Manager - TCPDRV.DOS - API
  6105.     AX = 4402h
  6106.     BX = file handle referencing device "TCPDRV$"
  6107.     CX = 0019h
  6108.     DS:DX -> buffer containing request block (see #0846)
  6109. Return: CF clear if successful
  6110.         buffer filled
  6111.     CF set on error
  6112.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6113. Program: TCPDRV.DOS is the low-level device driver supporting LAN Manager's
  6114.       TCP/IP protocol stack
  6115.  
  6116. Format of TCPDRV.DOS request block:
  6117. Offset    Size    Description    (Table 0846)
  6118.  00h    BYTE    (call) function number
  6119.         00h initialize ???
  6120.         06h get ???
  6121.         07h get ???
  6122.  01h    BYTE    (call) 00h
  6123.         (ret) error code if error, unchanged if successful
  6124.  02h    WORD    signature 4354h ('CT')
  6125. ---function 00h---
  6126.  04h    DWORD    (call) pointer to ??? FAR function
  6127.         function is called with ES:BX -> device driver request used to
  6128.           invoke this function
  6129.  08h  4 BYTEs    ???
  6130.  0Ch    DWORD    (call) pointer to ??? record, WORD at offset 22h is read
  6131.  10h    DWORD    (ret) -> ??? buffer if 0000h:0000h on call
  6132. ---function 06h---
  6133.  04h  4 BYTEs    ???
  6134.  08h    DWORD    (ret) pointer to ???
  6135. ---function 07h---
  6136.  04h    DWORD    (ret) pointer to ??? record
  6137. --------y-214402-----------------------------
  6138. INT 21 U - PC Tools 9 CPRLOW.EXE - GET CODE AND DATA ADDRESSES
  6139.     AX = 4402h
  6140.     BX = file handle referencing device "RECLOWLD"
  6141.     DS:DX -> buffer for address list (see #0847)
  6142.     CX ignored
  6143. Return: CF clear if successful
  6144.         buffer filled
  6145.     CF set on error
  6146.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6147.  
  6148. Format of CPRLOW address list:
  6149. Offset    Size    Description    (Table 0847)
  6150.  00h    WORD    segment of CPRLOW code
  6151.  02h    WORD    offset in code segment of ??? entry point
  6152.         (switches into protected mode)
  6153.  04h    WORD    offset in code segment of jump array (see #0848)
  6154.  06h    WORD    segment of copy of interrupt vector table at CPRLOW load time
  6155. Note:    neither the entry point nor the jump array is valid until after a
  6156.       CPR /LOAD, because CPR.EXE installs the code into CPRLOW at runtime.
  6157.  
  6158. Format of CPRLOW jump array:
  6159. Offset    Size    Description    (Table 0848)
  6160.  00h  3 BYTEs    initialize CPRLOW interrupt hooks
  6161.  03h  3 BYTEs    reset timers and enable CPR (hotkey enable)
  6162.  06h  3 BYTEs    disable CPR (hotkey disable)
  6163.  09h  3 BYTEs    clear ??? flag, hotkey disable, and ???
  6164.  0Ch  3 BYTEs    initialize delay loop counter (destroys AX,BX,CX,DX)
  6165.  0Fh  3 BYTEs    disable CPR completely (commandline /DISABLE)
  6166.  12h  3 BYTEs    enable ??? if CPR enabled by both cmdline and hotkey
  6167.  15h  3 BYTEs    enable CPR (commandline /ENABLE)
  6168. --------s-214402-----------------------------
  6169. INT 21 U - Creative Technology CTMMSYS.SYS v1.00.01 - API
  6170.     AX = 4402h
  6171.     BX = file handle for device "CTMMSYS$"
  6172.     CX = 0004h (size of data)
  6173.     DS:DX -> buffer for entry point (see #0849)
  6174. Return: CF clear if successful
  6175.         buffer updated
  6176.     CF set on error
  6177.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6178. Program: CTMMSYS.SYS is the Creative DOS Multimedia Architecture Integration
  6179.       driver
  6180. SeeAlso: AX=4402h"CTSB2",INT 80/BX=0000h"SBFM"
  6181.  
  6182. Format of CTMMSYS.SYS entry point record:
  6183. Offset    Size    Description    (Table 0849)
  6184.  00h    DWORD    (call) signature 4D6D7443h (ASCII "CtmM")
  6185.         (ret) pointer to CTMMSYS entry point (see #0850)
  6186. SeeAlso: #0851
  6187.  
  6188. (Table 0850)
  6189. Call CTMMSYS.SYS entry point with:
  6190.     AX = ???
  6191.     STACK:    WORD    ???
  6192.         WORD    ???
  6193.         WORD    ??? (0001h,0002h,0005h,0006h)
  6194.         WORD    ???
  6195.         DWORD    -> ???
  6196.         WORD    ???
  6197.         WORD    ???
  6198. Return: DX:AX = ??? or error code
  6199.         0000h:000Bh invalid value for ???
  6200.         0000h:000Fh API call already in progress
  6201. SeeAlso: #0849
  6202. --------s-214402-----------------------------
  6203. INT 21 U - Creative Technology CTSB2.SYS v1.01.01 - API
  6204.     AX = 4402h
  6205.     BX = file handle for device "CTSOUND0"
  6206.     CX = 0004h (size of data)
  6207.     DS:DX -> buffer for entry point (see #0851)
  6208. Return: CF clear if successful
  6209.         buffer updated
  6210.     CF set on error
  6211.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6212. Program: CTMMSYS.SYS is the Creative DOS Multimedia Architecture Integration
  6213.       driver
  6214. SeeAlso: AX=4402h"CTMMSYS",INT 80/BX=0000h"SBFM"
  6215.  
  6216. Format of CTSB2.SYS entry point record:
  6217. Offset    Size    Description    (Table 0851)
  6218.  00h    DWORD    (call) signature 4D6D7443h (ASCII "CtmM")
  6219.         (ret) pointer to CTSB2 entry point (see #0852)
  6220. SeeAlso: #0849
  6221.  
  6222. (Table 0852)
  6223. Call CTSB2.SYS entry point with:
  6224.     AX = ???
  6225.     STACK:    DWORD    -> ???
  6226.         WORD    function number
  6227.             (0100h,0200h,0300h,0400h,0500h,0600h,0701h)
  6228.         DWORD    -> ???
  6229.         WORD    ???
  6230.         WORD    ???
  6231. Return: DX:AX = ??? or error code
  6232.         0000h:0004h invalid subfunction???
  6233.         0000h:000Bh invalid value for ???
  6234.         0000h:000Fh API call already in progress
  6235. SeeAlso: #0851
  6236. --------m-214402-----------------------------
  6237. INT 21 U - Novell DOS 7 EMM386.EXE - GET STATE RECORD???
  6238.     AX = 4402h
  6239.     BX = file handle for device "EMMXXXX0"
  6240.     CX = 003Eh (size of state record)
  6241.     DS:DX -> buffer for state record (see #0853)
  6242. Return: CF clear if successful
  6243.         buffer filled (see #2852 at INT 67/AH=3Fh)
  6244.     CF set on error
  6245.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6246.  
  6247. Format of Novell DOS 7 EMM386.EXE state record:
  6248. Offset    Size    Description    (Table 0853)
  6249.  00h    WORD    signature EDC0h
  6250.  02h 60 BYTEs    ???
  6251. --------m-214402SF00-------------------------
  6252. INT 21 U - Memory Managers - GET API ENTRY POINT
  6253.     AX = 4402h subfn 00h
  6254.     BX = file handle for device "EMMXXXX0"
  6255.     CX = 0006h (size of buffer in bytes)
  6256.     DS:DX -> buffer for API entry point record (see #0854)
  6257.         first byte must be 00h on entry
  6258. Return: CF clear if successful
  6259.         buffer filled (see #2852 at INT 67/AH=3Fh)
  6260.     CF set on error
  6261.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6262. Notes:    this function is supported by Microsoft EMM386.EXE v4.45+ and
  6263.       CEMM v5.10+, and is intended for use by MS Windows as it starts up
  6264.     if no other program has hooked INT 67, an alternate installation
  6265.       check for CEMM is testing for the string
  6266.       "COMPAQ EXPANDED MEMORY MANAGER 386" at offset 14h in the INT 67
  6267.       handler's segment; if present, the word at offset 12h contains the
  6268.       offset of the API entry point
  6269. SeeAlso: AX=4402h/SF=01h,AX=4402h/SF=02h,AX=4402h"EMM386",INT 67/AH=3Fh
  6270.  
  6271. Format of memory manager API entry point record:
  6272. Offset    Size    Description    (Table 0854)
  6273.  00h    WORD    ??? (0022h for CEMM 5.11, 0025h for MS EMM386 v4.45)
  6274.  02h    DWORD    manager's private API entry point
  6275.         (see #0855,#2915 at INT 67/AX=FFA5h)
  6276.  
  6277. (Table 0855)
  6278. Call CEMM v5.10+ entry point with:
  6279.     AH = 00h get memory manager's state
  6280.         Return: AH = state
  6281.             bit 0: turned OFF
  6282.             bit 1: AUTO mode enabled
  6283.     AH = 01h set memory manager's state
  6284.         AL = new state (00h ON, 01h OFF, 02h AUTO)
  6285.         Return: CF clear if successful
  6286.             CF set on error
  6287.     AH = 02h Weitek coprocessor support
  6288.         AL = subfunction
  6289.         00h get Weitek support state
  6290.             Return: AL = status
  6291.                 bit 0: Weitek coprocessor is present
  6292.                 bit 1: Weitek support is enabled
  6293.         01h turn on Weitek support
  6294.         02h turn off Weitek support
  6295.         Return: CF clear if successful
  6296.             CF set on error
  6297.             AH = error code (01h invalid subfunc, 02h no Weitek)
  6298.     AH = 05h get statistics
  6299.         ???
  6300.     AH > 06h
  6301.         Return: CF set
  6302.             AH = 01h (invalid function)
  6303. Notes:    AH=03h,04h,06h are NOPs which return CF clear, presumably for backwards
  6304.       compatibility with earlier versions of CEMM
  6305.     in v5.11, AH=05h merely prints an error message (using INT 21/AH=09h)
  6306.       stating that a different version of CEMM is installed and it is
  6307.       therefore not possible to display the statistics
  6308. --------m-214402SF01-------------------------
  6309. INT 21 U - Memory Managers - GET EMM IMPORT STRUCTURE ADDRESS
  6310.     AX = 4402h subfn 01h
  6311.     BX = file handle for device "EMMXXXX0"
  6312.     CX = 0006h (size of buffer in bytes)
  6313.     DS:DX -> buffer for EMM import structure record (see #0856)
  6314.         first byte must be 01h on entry
  6315. Return: CF clear if successful
  6316.         buffer filled (see also #2852 at INT 67/AH=3Fh)
  6317.     CF set on error
  6318.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6319. Notes:    this function is supported by Microsoft EMM386.EXE v4.45+,
  6320.       QEMM-386 v6+, and CEMM v5.10+, and is intended for use by MS Windows
  6321.       as it starts up
  6322.     for QEMM-386, this call always returns an error if Windows3 support
  6323.       has been disabled with the NW3 switch
  6324. SeeAlso: AX=4402h/SF=00h,AX=4402h"EMM386",INT 2F/AX=D201h/BX=5145h
  6325. SeeAlso: INT 67/AH=3Fh
  6326.  
  6327. Format of EMM import structure record:
  6328. Offset    Size    Description    (Table 0856)
  6329.  00h    DWORD    physical address of EMM import structure (see #0857)
  6330.  04h    BYTE    EMM import structure major version
  6331.  05h    BYTE    EMM import structure minor version
  6332. Note:    version 1.00 contains only EMS information (Windows 3.0+)
  6333.     version 1.10 contains UMB/XMS/HMA/EMS information (Windows 3.1)
  6334.     version 1.11 is version 1.10 plus memory manager maker/product name
  6335. SeeAlso: #2892
  6336.  
  6337. Format of Global EMM Import record:
  6338. Offset    Size    Description    (Table 0857)
  6339.  00h    BYTE    bit flags
  6340.         bit 2: ???
  6341.         bit 3: free EMM386 virtual HMA only if hma_page_table_paddr!=0
  6342.         bit 4: no UMB???
  6343.  01h    BYTE    reserved (0)
  6344.  02h    WORD    size of structure in bytes
  6345.  04h    WORD    structure version
  6346.  06h    DWORD    reserved
  6347.  0Ah 384 BYTEs    64 EMS frame status records (see #0858), one per 16K of
  6348.           real-mode 1M address space
  6349. 18Ah    BYTE    ??? (must be at least 3*number_of_EMS_frames+4)
  6350. 18Bh    BYTE    number of UMB frame descriptors following
  6351. 18Ch 4N DWORDs    UMB frame descriptors
  6352.         each is 4 DWORDs giving physical page numbers for the four
  6353.           4K pages of a 16K EMS frame (00000000h if non-UMB page)
  6354. var    BYTE    number of EMS handle info records following
  6355.     16N BYTEs    EMS handle info records (see #0860)
  6356. ---version 1.10+ ---
  6357.     DWORD    realmode INT 67 vector (used by Windows to set breakpoints)
  6358.     DWORD    physical address of HMA page table values
  6359.     BYTE    number of free page entries following
  6360.      2N DWORDs    free page entries
  6361.         each is:
  6362.             DWORD    physical page number
  6363.             DWORD    number of consecutive physical pages
  6364.     BYTE    number of XMS handle info records following
  6365.         00h if memory manager does not emulate XMS or has real mode
  6366.           XMS code which can execute in the Windows environment
  6367.     12N BYTEs    XMS handle info records (see #0861)
  6368.     BYTE    number of free UMB info records following
  6369.      2N WORDs    free UMB info records
  6370.         each is:
  6371.             WORD    real mode start segment
  6372.             WORD    size in paragraphs
  6373. ---version 1.11---
  6374.      20 BYTEs    blank-padded maker name
  6375.      20 BYTEs    blank-padded product name
  6376.  
  6377. Format of EMS frame status record:
  6378. Offset    Size    Description    (Table 0858)
  6379.  00h    BYTE    frame type (see #0859)
  6380.  01h    BYTE    owner handle (00h/FFh = none) from frame including UMB
  6381.         index to UMB frame descriptors
  6382.  02h    WORD    logical page for frame, 7FFFh if none, FFFFh if non-EMS frame
  6383.  04h    BYTE    EMS physical page number (FFh for non-EMS = don't care???)
  6384.  05h    BYTE    flags for non-EMS frames (00h for EMS frame)
  6385.         bits 0,1 for first 4K, bits 2,3 for second 4K, etc:
  6386.           10: direct mapping (linear address = physical address)
  6387.           01: UMB mapping
  6388.  
  6389. Bitfields for EMS frame type:
  6390. Bit(s)    Description    (Table 0859)
  6391.  0    EMS frame
  6392.  1    (if EMS frame) in standard 64K page frame
  6393.  2    first 4K of frame is UMB
  6394.  3    second 4K of frame is UMB
  6395.  4    third 4K of frame is UMB
  6396.  5    last 4K of frame is UMB
  6397.  
  6398. Format of EMS handle info record:
  6399. Offset    Size    Description    (Table 0860)
  6400.  00h    BYTE    handle number (00h = system handle)
  6401.  01h    BYTE    flags
  6402.         bit 0: normal handle rather than system handle
  6403.         bit 2: ??? (set by some EMS managers)
  6404.  02h  8 BYTEs    EMS handle's name
  6405.  0Ah    WORD    number of 16K pages for handle
  6406.  0Ch    DWORD    physical address of page table entries forming page map
  6407. Note:    all values should be zero for the system handle if no large frame
  6408.       support is present
  6409.  
  6410. Format of XMS handle info record:
  6411. Offset    Size    Description    (Table 0861)
  6412.  00h    WORD    handle
  6413.  02h    WORD    flags
  6414.         bit 0: handle usable by Windows
  6415.             (already in use when Windows started if clear)
  6416.         bit 1: reserved (0)
  6417.  04h    DWORD    size in KB (may be zero, used only if flags bit 0 set)
  6418.  08h    DWORD    physical address (only if flags bit 0 set)
  6419. --------m-214402SF02-------------------------
  6420. INT 21 U - Memory Managers - GET MEMORY MANAGER VERSION
  6421.     AX = 4402h subfn 02h
  6422.     BX = file handle for device "EMMXXXX0"
  6423.     CX = 0002h (size of buffer in bytes)
  6424.     DS:DX -> buffer for memory manager version (see #0862)
  6425.         first byte must be 02h on entry
  6426. Return: CF clear if successful
  6427.         buffer filled
  6428.     CF set on error
  6429.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6430. Note:    this function is supported by Microsoft EMM386.EXE v4.45+ and
  6431.       CEMM v5.10+, and is intended for use by MS Windows as it starts up
  6432. SeeAlso: AX=4402h/SF=00h,AX=4402h"EMM386",INT 67/AH=3Fh
  6433.  
  6434. Format of memory manager version:
  6435. Offset    Size    Description    (Table 0862)
  6436.  00h    BYTE    major version
  6437.  01h    BYTE    minor version (binary)
  6438. --------m-214402-----------------------------
  6439. INT 21 U - Microsoft EMM386.EXE v4.45 - GET MEMORY MANAGER INFORMATION
  6440.     AX = 4402h
  6441.     BX = file handle for device "EMMXXXX0"
  6442.     CX = size of buffer in bytes (varies, see #0863)
  6443.     DS:DX -> buffer for returned data (see #0863)
  6444.         first byte must be set on entry to indicate desired data
  6445. Return: CF clear if successful
  6446.         buffer filled
  6447.     CF set on error
  6448.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6449. Notes:    an error is returned if the number of bytes to be read does not match
  6450.       the number of bytes returned for the specified data item
  6451.     this function is part of the interface which allows MS Windows to
  6452.       cooperate with memory managers
  6453. SeeAlso: AX=4402h/SF=00h,AX=4402h/SF=01h,AX=4402h/SF=02h,INT 67/AX=FFA5h
  6454.  
  6455. Format of EMM386.EXE data buffer:
  6456. Offset    Size    Description    (Table 0863)
  6457.  00h    BYTE    (call) function
  6458.         03h get ???
  6459.         04h get ???
  6460. ---function 03h---
  6461.  00h    WORD    ???
  6462.  02h    WORD    ???
  6463. ---function 04h---
  6464.  00h    WORD    segment of UMB containing EMM386 code/data
  6465.  02h    WORD    number of paragraphs of EMM386 code/data in UMB
  6466.  04h    WORD    ???
  6467. ----------214402-----------------------------
  6468. INT 21 U - IFSHLP.SYS - GET ENTRY POINT
  6469.     AX = 4402h
  6470.     BX = file handle for device "IFS$HLP$"
  6471.     CX = 0008h (size of buffer in bytes)
  6472.     DS:DX -> buffer for entry point record (see #0761 at AH=3Fh"IFSHLP")
  6473. Return: CF clear if successful
  6474.         buffer filled
  6475.     CF set on error
  6476.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6477. SeeAlso: AH=3Fh"IFSHLP"
  6478. --------D-214403-----------------------------
  6479. INT 21 - DOS 2+ - IOCTL - WRITE TO CHARACTER DEVICE CONTROL CHANNEL
  6480.     AX = 4403h
  6481.     BX = file handle referencing character device
  6482.     CX = number of bytes to write
  6483.     DS:DX -> data to write
  6484. Return: CF clear if successful
  6485.         AX = number of bytes actually written
  6486.     CF set on error
  6487.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6488. Notes:    format of data is driver-specific
  6489.       (also see separate entries below for some specific cases)
  6490.     if the file handle refers to "4DOSSTAK", the 4DOS (v2.x-3.03)
  6491.       KEYSTACK.SYS driver will push the specified characters on the
  6492.       keyboard stack; similarly for "NDOSSTAK", the NDOS KEYSTACK.SYS
  6493.       driver will push the characters onto the keyboard stack
  6494. SeeAlso: AX=4400h,AX=4402h"DOS 2+",AX=4405h"DOS",INT 2F/AX=122Bh
  6495. SeeAlso: INT 2F/AX=D44Dh,INT 2F/AX=D44Fh
  6496. --------c-214403-----------------------------
  6497. INT 21 - SMARTDRV.SYS v3.x only - IOCTL - CACHE CONTROL
  6498.     AX = 4403h
  6499.     BX = handle for device "SMARTAAR"
  6500.     CX = number of bytes to write
  6501.     DS:DX -> SMARTDRV control block (see #0865)
  6502. Return: CF clear if successful
  6503.         AX = number of bytes actually written
  6504.         0000h if control block too small for given command
  6505.     CF set on error
  6506.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6507. Note:    NCache2 (from the Norton Utilities v8.0) attempts to support this
  6508.       interface, but does not do so correctly, often hanging the system;
  6509.       one should use the SmartDrive v4.x or NCache private interfaces
  6510.       (see INT 2F/AX=4A10h/BX=0000h,INT 2F/AX=FE00h/DI=4E55h)
  6511. SeeAlso: AX=4402h"SMARTDRV",INT 2F/AX=4A10h/BX=0000h
  6512.  
  6513. (Table 0864)
  6514. Values for SMARTDRV function code:
  6515.  00h    flush cache
  6516.  01h    flush and discard cache
  6517.  02h    disable caching (flushes and discards cache first)
  6518.  03h    enable caching
  6519.  04h    control write caching
  6520.  05h    set flushing tick count
  6521.  06h    lock cache contents
  6522.  07h    unlock cache contents
  6523.  08h    set flush-on-reboot flag
  6524.  09h    unused
  6525.  0Ah    control full-track caching
  6526.  0Bh    reduce cache size
  6527.  0Ch    increase cache size
  6528.  0Dh    set INT 13 chain address
  6529.  
  6530. Format of SMARTDRV control block:
  6531. Offset    Size    Description    (Table 0865)
  6532.  00h    BYTE    function code (see #0864)
  6533. ---functions 00h-03h,06h,07h---
  6534.  no additional fields
  6535. ---function 04h---
  6536.  01h    BYTE    write caching control action
  6537.         00h turn off write-through
  6538.         01h turn on write-through
  6539.         02h turn off write buffering (also flushes cache)
  6540.         03h turn on write buffering (also flushes cache)
  6541. ---function 05h---
  6542.  01h    WORD    number of timer ticks between cache flushes
  6543. ---function 08h---
  6544.  01h    BYTE    new flush-on-reboot flag (00h off, 01h on)
  6545. ---function 0Ah---
  6546.  01h    BYTE    full-track writes are
  6547.         00h not cached
  6548.         01h cached
  6549. ---functions 0Bh,0Ch---
  6550.  01h    WORD    number of 16K pages by which to increase/reduce cache size
  6551. ---function 0Dh---
  6552.  01h    DWORD    new address to which to chain on INT 13
  6553. Note:    the previous address is not preserved
  6554. --------d-214403-----------------------------
  6555. INT 21 - CD-ROM device driver - IOCTL OUTPUT
  6556.     AX = 4403h
  6557.     BX = file handle referencing character device for CD-ROM driver
  6558.     CX = number of bytes to write
  6559.     DS:DX -> control block (see #0866)
  6560. Return: CF clear if successful
  6561.         AX = number of bytes actually written
  6562.     CF set on error
  6563.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6564. SeeAlso: AX=4402h"CD-ROM",INT 2F/AX=0802h
  6565.  
  6566. Format of CR-ROM control block:
  6567. Offset    Size    Description    (Table 0866)
  6568.  00h    BYTE    function code
  6569.         00h eject disk
  6570.         01h lock/unlock door
  6571.         02h reset drive
  6572.         03h control audio channel
  6573.         04h write device control string
  6574.         05h close tray
  6575. ---functions 00h,02h,05h---
  6576.  no further fields
  6577. ---function 01h---
  6578.  01h    BYTE    lock function
  6579.         00h unlock door
  6580.         01h lock door
  6581. ---function 03h---
  6582.  01h    BYTE    input channel (0-3) for output channel 0
  6583.  02h    BYTE    volume for output channel 0
  6584.  03h    BYTE    input channel (0-3) for output channel 1
  6585.  04h    BYTE    volume for output channel 1
  6586.  05h    BYTE    input channel (0-3) for output channel 2
  6587.  06h    BYTE    volume for output channel 2
  6588.  07h    BYTE    input channel (0-3) for output channel 3
  6589.  08h    BYTE    volume for output channel 3
  6590. Note:    output channels 0 and 1 are left and right, 2 and 3 are left prime and
  6591.       right prime; a volume of 00h is off
  6592. ---function 04h---
  6593.  01h  N BYTEs    bytes to send directly to the CD-ROM drive without
  6594.           interpretation
  6595. --------D-214403-----------------------------
  6596. INT 21 U - MS-DOS 7.0 - CONFIG$ device - SET??? CONFIGURATION INFORMATION
  6597.     AX = 4403h
  6598.     BX = file handle for character device "CONFIG$"
  6599.     CX = number of bytes to write
  6600.     DS:DX -> buffer containing ???
  6601. Return: CF clear if successful
  6602.         AX = number of bytes actually written
  6603.     CF set on error
  6604.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6605. Note:    IOCTL Output to CONFIG$ is only available while IO.SYS is booting
  6606.       the system; once CONFIG.SYS has been processed, this call always
  6607.       succeeds, ignoring any input
  6608. SeeAlso: AX=4403h"CONFIG$"
  6609. --------d-214403-----------------------------
  6610. INT 21 - Brian Antoine Seagate ST-01 SCSI.SYS - IOCTL - EXECUTE COMMANDS
  6611.     AX = 4403h
  6612.     BX = handle for device "SCSITAPE"
  6613.     CX = number of bytes to write
  6614.     DS:DX -> SCSITAPE control block (see #0867)
  6615. Return: CF clear if successful
  6616.         AX = number of bytes actually written
  6617.     CF set on error
  6618.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6619. SeeAlso: AX=4405h"ST-01",INT 78/AH=10h
  6620.  
  6621. Format of SCSITAPE control block:
  6622. Offset    Size    Description    (Table 0867)
  6623.  00h    WORD    command type
  6624.         'F' Format (argument 1 = interleave, argument 2 = format type)
  6625.         'E' Erase
  6626.         'R' Rewind
  6627.         'L' Load
  6628.         'N' No Load
  6629.         'S' Space (argument 1 = count, argument 2 = type)
  6630.         'M' File Mark (argument 1 = count)
  6631.         'A' Reassign
  6632.  02h    WORD    argument 1
  6633.  04h    WORD    argument 2
  6634.  06h    WORD    segment of command buffer
  6635.  08h    WORD    offset of command buffer
  6636.  0Ah    WORD    length of command buffer
  6637. --------E-214403-----------------------------
  6638. INT 21 U - AI Architects - OS/x86??? - API
  6639.     AX = 4403h
  6640.     BX = handle for device "AIA_OS"
  6641.     CX = number of bytes to write (ignored)
  6642.     DS:DX -> 12-byte buffer (see #0868), first byte is command:
  6643.           81h installation check
  6644.           82h get API entry point
  6645.           84h uninstall
  6646. Return: CF clear if successful
  6647.         AX = number of bytes actually written
  6648.         DS:DX buffer filled
  6649.     CF set on error
  6650.         AX = error code (01h,05h,06h,0Ch,0Dh) (see #1020 at AH=59h)
  6651. Notes:    these functions are only available if the DOS extender was loaded as a
  6652.       device driver in CONFIG.SYS
  6653.     called by TKERNEL (a licensed version of AI Architects/Ergo OS/x86)
  6654. SeeAlso: INT 2F/AX=FBA1h/BX=0081h,INT 2F/AX=FBA1h/BX=0082h
  6655. Index:    installation check;OS/x86|entry point;OS/x86|uninstall;OS/x86
  6656.  
  6657. Format of buffer on return:
  6658. Offset    Size    Description    (Table 0868)
  6659.  00h  4 BYTEs    signature "IABH"
  6660. ---if function 81h---
  6661.  (no additional fields)
  6662. ---if function 82h---
  6663.  04h    DWORD    pointer to API entry point (see INT 2F/AX=FBA1h/BX=0082h)
  6664. ---if function 84h---
  6665.  04h    WORD    success indicator
  6666.  06h    WORD    segment of ???
  6667.  08h    WORD    segment of ??? memory block to free if nonzero
  6668.  0Ah    WORD    segment of ??? memory block to free if nonzero
  6669. --------V-214403-----------------------------
  6670. INT 21 - PGS1600.DEV - IOCTL - SET CONFIGURATION???
  6671.     AX = 4403h
  6672.     BX = file handle for device "PGS1600$"
  6673.     CX = 0018h (size of buffer)
  6674.     DS:DX -> configuration buffer (see #0826 at AX=4402h"PGS1600")
  6675. Return: CF clear if successful
  6676.         AX = number of bytes actually written
  6677.     CF set on error
  6678.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6679. Program: PGS1600.DEV is a device driver for the Cornerstone Technology PG1600
  6680.       display adapter, which provides a 1600x1200 monochrome display as
  6681.       well as one of two emulations, MDA or CGA.
  6682. SeeAlso: AX=4402h"PGS1600"
  6683. --------N-214403-----------------------------
  6684. INT 21 - PC/TCP IPCUST.SYS - RESET CONFIGURATION DATA READ POINTER
  6685.     AX = 4403h
  6686.     BX = file handle referencing device "$IPCUST"
  6687.     CX, DS:DX ignored
  6688. Return: CF clear if successful
  6689.         AX destroyed
  6690.     CF set on error
  6691.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6692. Notes:    there are a total of 378h bytes of configuration data for IPCUST.SYS
  6693.       version 2.05.     If less than the entire data is read or written,
  6694.       the next read/write continues where the previous one ended; this
  6695.       call and AX=4402h both reset the location at which the next
  6696.       operation starts to zero
  6697.     v2.1+ uses a new configuration method, but allows the installation
  6698.       of IPCUST.SYS for backward compatibility with other software which
  6699.       must read the PC/TCP configuration
  6700. SeeAlso: AH=3Fh"IPCUST",AH=40h"IPCUST",AX=4402h"IPCUST"
  6701. --------V-214403-----------------------------
  6702. INT 21 - Compaq AG1024.SYS - CPQ_MGES - IOCTL OUTPUT
  6703.     AX = 4403h
  6704.     BX = file handle referencing device "CPQ_MGES"
  6705.     DS:DX -> request packet (see #0869)
  6706.     CX ignored
  6707. Return: CF clear if successful
  6708.         AX destroyed
  6709.         data buffer filled (if applicable)
  6710.         first word of request packet set to number of bytes of data
  6711.           available (amount returned is smaller of this and requested
  6712.           amount)
  6713.     CF set on error
  6714.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6715. Program: AG1024.SYS is a device driver for the Advanced Graphics 1024 adapter
  6716. SeeAlso: AX=4403h"RGDI"
  6717.  
  6718. Format of Compaq AG1024.SYS request packet:
  6719. Offset    Size    Description    (Table 0869)
  6720.  00h    WORD    function
  6721.         0000h get ??? (26h bytes)
  6722.         0001h get ??? (36h bytes)
  6723.         0002h set ??? (same as returned by function 0001h)
  6724.         0003h get ??? (6 bytes)
  6725.         0004h get ???
  6726.         0005h get ???
  6727.         0006h get ??? (10h bytes)
  6728.         0007h set ??? (same as returned by function 0006h)
  6729. ---functions 00h-03h,06h,07h---
  6730.  02h    WORD    size of data buffer
  6731.  04h    DWORD    -> buffer for function's data
  6732.  ---functions 04h,05h---
  6733.  02h    WORD    ???
  6734.  04h    WORD    size of data buffer
  6735.  06h    DWORD    -> buffer to receive data
  6736. --------V-214403-----------------------------
  6737. INT 21 - Compaq AG1024.SYS - RGDI - IOCTL OUTPUT
  6738.     AX = 4403h
  6739.     BX = file handle referencing device "$$$$RGDI"
  6740.     DS:DX -> request packet (see #0870)
  6741.     CX ignored
  6742. Return: CF clear if successful
  6743.         AX destroyed
  6744.         data buffer filled (if applicable)
  6745.         first word of request packet set to number of bytes of data
  6746.           available (amount returned is smaller of this and requested
  6747.           amount)
  6748.     CF set on error
  6749.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6750. Program: AG1024.SYS is a device driver for the Advanced Graphics 1024 adapter
  6751. SeeAlso: AX=4402h"RGDI",AX=4403h"CPQ_MGES"
  6752.  
  6753. Format of Compaq AG1024.SYS request packet:
  6754. Offset    Size    Description    (Table 0870)
  6755.  00h    WORD    function
  6756.         0000h get entry points
  6757.         0001h get ???
  6758.  02h    DWORD    address of buffer for returned data
  6759. --------m-214403SF01-------------------------
  6760. INT 21 U - Qualitas 386MAX v6.01+ - TURN 386MAX OFF
  6761.     AX = 4403h subfn 01h
  6762.     BX = handle for device "386MAX$$"
  6763.     DS:DX -> BYTE 01h
  6764.     CX ignored
  6765. Return: DS:DX -> BYTE status (00h = successful)
  6766.     CF clear if successful
  6767.         AX destroyed
  6768.     CF set on error
  6769.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6770. Note:    this function will fail if any EMS or UMBs are in use
  6771. SeeAlso: AX=4403h/SF=02h,AX=4403h/SF=03h,AX=4403h/SF=05h
  6772. --------m-214403SF02-------------------------
  6773. INT 21 U - Qualitas 386MAX v6.01+ - TURN 386MAX ON
  6774.     AX = 4403h subfn 02h
  6775.     BX = handle for device "386MAX$$"
  6776.     DS:DX -> BYTE 02h
  6777.     CX ignored
  6778. Return: DS:DX -> BYTE status (00h = successful)
  6779.     CF clear if successful
  6780.         AX destroyed
  6781.     CF set on error
  6782.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6783. SeeAlso: AX=4403h/SF=01h,AX=4403h/SF=03h,AX=4403h/SF=05h
  6784. --------m-214403SF03-------------------------
  6785. INT 21 U - Qualitas 386MAX v6.01+ - SET STATE
  6786.     AX = 4403h subfn 03h
  6787.     BX = handle for device "386MAX$$"
  6788.     CX = number of bytes to copy (up to size of state buffer)
  6789.     DS:DX -> BYTE 03h followed by state buffer
  6790.           (see #0809 at AX=4402h"386MAX")
  6791. Return: CF clear if successful
  6792.         AX = number of bytes actually written
  6793.     CF set on error
  6794.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6795. Note:    the first byte of the buffer must be either 01h, 02h, or 03h
  6796.       (specifying the version of the state record) and the buffer must
  6797.       contain CX bytes AFTER the initial byte
  6798. SeeAlso: AX=4402h"386MAX"
  6799. --------m-214403SF05-------------------------
  6800. INT 21 U - Qualitas 386MAX v7.00+ - LIMIT AUTOMATIC ACTIVATION TO STD EMS CALLS
  6801.     AX = 4403h subfn 05h
  6802.     BX = handle for device "386MAX$$"
  6803.     DS:DX -> BYTE 05h
  6804.     CX ignored
  6805. Return: CF clear if successful
  6806.         AX destroyed
  6807.     CF set on error
  6808.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6809. Desc:    specifies that 386MAX will only shift from AUTO to ON mode on standard
  6810.       EMS calls INT 67/AH=40h-5Dh
  6811. SeeAlso: AX=4403h/SF=02h,AX=4403h/SF=03h,AX=4403h/SF=06h
  6812. --------m-214403SF06-------------------------
  6813. INT 21 U - Qualitas 386MAX v7.00+ - ALLOW AUTOMATIC ACTIVATION ON ANY INT 67
  6814.     AX = 4403h subfn 06h
  6815.     BX = handle for device "386MAX$$"
  6816.     DS:DX -> BYTE 06h
  6817.     CX ignored
  6818. Return: CF clear if successful
  6819.         AX destroyed
  6820.     CF set on error
  6821.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6822. Desc:    specified that 386MAX should shift from AUTO to ON mode on any INT 67
  6823.       call other than INT 67/AH=3Fh
  6824. SeeAlso: AX=4403h/SF=01h,AX=4403h/SF=03h,AX=4403h/SF=05h
  6825. --------n-214403-----------------------------
  6826. INT 21 U - PenDOS PENDEV.SYS - ???
  6827.     AX = 4403h
  6828.     BX = file handle for device "$$PENDOS" or "$$PD_REG"
  6829.     CX = size of buffer
  6830.     DS:DX -> buffer containing ???
  6831. Return: CF clear if successful
  6832.         buffer filled
  6833.     CF set on error
  6834.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6835. Program: A limited version of PenDOS by Communication Intelligence Corporation,
  6836.       which provides pen capability to keyboard-based programs, is bundled
  6837.       with IBM DOS 6.1
  6838. Note:    this call sets the WORD at offset 1Ah into the device driver request
  6839.       header used to call the driver to 0000h.
  6840. SeeAlso: AX=4402h"PENDEV.SYS"
  6841. --------D-214404-----------------------------
  6842. INT 21 - DOS 2+ - IOCTL - READ FROM BLOCK DEVICE CONTROL CHANNEL
  6843.     AX = 4404h
  6844.     BL = drive number (00h = default, 01h = A:, etc.)
  6845.     CX = number of bytes to read
  6846.     DS:DX -> buffer
  6847. Return: CF clear if successful
  6848.         AX = number of bytes actually read
  6849.     CF set on error
  6850.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6851. Note:    format of data is driver-specific
  6852. SeeAlso: AX=4402h"DOS 2+",AX=4405h"DOS",INT 2F/AX=122Bh
  6853. --------k-214404-----------------------------
  6854. INT 21 - Stacker - GET DEVICE DRIVER ADDRESS AND SET VOLUME NUMBER
  6855.     AX = 4404h
  6856.     BL = drive number (00h = default, 01h = A:, etc.)
  6857.     CX = 0004h
  6858.     DS:DX -> DWORD buffer to receive device driver address
  6859. Return: buffer filled with pointer into Stacker device driver (see #1886):
  6860.       driver + 19h if Stacker Anywhere controls this drive
  6861.       driver + 1Ah if Stacker controls this drive
  6862.       unchanged else
  6863. Notes:    in addition to returning the address of the Stacker device driver,
  6864.       this call also sets the volume number at offset 58h in the device
  6865.       driver (see #1886 at INT 25/AX=CDCDh)
  6866.     Stacker Anywhere does not link its built-in device driver into
  6867.       the standard device driver chain, but it can be found via CDS/DPB
  6868.     this call can be used as an installation check for all versions of
  6869.       Stacker and Stacker Anywhere to avoid the INT 25 call
  6870. SeeAlso: AX=4408h,AX=440Eh,AH=52h,INT 25/AX=CDCDh
  6871. --------k-214404-----------------------------
  6872. INT 21 - Stacker - GET STACVOL FILE SECTORS
  6873.     AX = 4404h
  6874.     BL = drive number (0 is current drive)
  6875.     CX = byte count (i.e., 200h = 1 sector)
  6876.     DS:DX -> buffer (see #0871)
  6877. Return: Data Buffer contains the number of sectors requested from the
  6878.       STACVOL physical file for the drive specified.
  6879.  
  6880. Format of Stacker buffer:
  6881. Offset    Size    Description    (Table 0871)
  6882.  00h    WORD    01CDh
  6883.  02h    WORD    sector count
  6884.  04h    DWORD    number of starting sector
  6885.  08h    DWORD    far pointer to Data Buffer
  6886. --------k-214404-----------------------------
  6887. INT 21 - DUBLDISK.SYS v2.6 - GET INFO
  6888.     AX = 4404h
  6889.     BL = drive number of DoubleDisk drive (00h = default, 01h = A:, etc.)
  6890.     CX = number of bytes (000Ah-0014h, call ignored otherwise)
  6891.     DS:DX -> data record (see #0872)
  6892. Return: CF clear if successful
  6893.         AX = number of bytes read
  6894.     CF set on error
  6895.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6896. Program: DUBLDISK.SYS is the device driver portion of DoubleDisk, a disk
  6897.       expander by Vertisoft Systems, Inc.
  6898. Note:    the installation check for v2.6 consists of scanning memory for the
  6899.       signature "FAT 2.6  byte:", which is immediately followed by a data
  6900.       table (see #0873)
  6901. BUG:    VOPT (a disk optimizer by Golden Bow Software) assumes that any driver
  6902.       which returns the "correct" number of bytes when the first word of
  6903.       the buffer for the data record contains the signature value 4444h is
  6904.       DoubleDisk; a workaround is for the non-DoubleDisk driver to return
  6905.       no data if the signature is present
  6906. SeeAlso: AX=440Dh"DOS 3.2+"
  6907. Index:    installation check;DUBLDISK.SYS
  6908.  
  6909. Format of DUBLDISK data record:
  6910. Offset    Size    Description    (Table 0872)
  6911.  00h    WORD    (call) signature 4444h
  6912.  02h    BYTE    (call) function
  6913.             00h ???
  6914.             01h ???
  6915. ---function 00h---
  6916.  02h    BYTE    (ret) ???
  6917.  03h    BYTE    (ret) ???
  6918. ---function 01h---
  6919.  02h    WORD    (ret) 4444h
  6920.  04h    WORD    allocation unit size???
  6921.  06h    WORD    ???
  6922.  08h    WORD    ???
  6923.  0Ah    BYTE    ???
  6924.  
  6925. Format of DUBLDISK signature data table:
  6926. Offset    Size    Description    (Table 0873)
  6927.  00h  5 BYTEs    ???
  6928.  05h    BYTE    first drive number
  6929.  06h    BYTE    number of drives
  6930.  07h    ???
  6931. --------k-214404-----------------------------
  6932. INT 21 - DBLSPACE.BIN - IOCTL - FLUSH OR INVALIDATE INTERNAL CACHES
  6933.     AX = 4404h
  6934.     BL = drive number (00h = default, 01h = A:, etc)
  6935.     CX = 000Ah (size of DSPACKET structure)
  6936.     DS:DX -> DSPACKET structure (see #0874)
  6937. Return: CF clear if IOCTL successful -- check DSPACKET for actual status
  6938.         AX = number of bytes actually transferred
  6939.     CF set on error
  6940.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6941. SeeAlso: AX=4405h"DBLSPACE",INT 2F/AX=4A11h/BX=0000h
  6942.  
  6943. Format of DoubleSpace DSPACKET structure:
  6944. Offset    Size    Description    (Table 0874)
  6945.  00h    WORD    signature 444Dh ("DM")
  6946.  02h    BYTE    command code
  6947.         46h ('F') flush internal caches
  6948.         49h ('I') flush and invalidate internal caches
  6949.  03h    WORD    result code
  6950.         (ret) 4F4Bh ("OK") if successful, else unchanged
  6951.  05h  5 BYTEs    padding
  6952. --------k-214404-----------------------------
  6953. INT 21 - DBLSPACE.BIN v6.2 - IOCTL - GET ??? FOR SPECIFIED DRIVE
  6954.     AX = 4404h
  6955.     BL = drive number (00h = default, 01h = A:, etc)
  6956.     CX = size of DSPACKET structure (ignored in DOS 6.2)
  6957.     DS:DX -> DSPACKET structure (see #0875)
  6958. Return: CF clear if IOCTL successful -- check DSPACKET for actual status
  6959.         AX = number of bytes actually transferred
  6960.     CF set on error
  6961.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6962. SeeAlso: AX=4405h"DBLSPACE",INT 2F/AX=4A11h/BX=0000h
  6963.  
  6964. Format of DoubleSpace DSPACKET structure:
  6965. Offset    Size    Description    (Table 0875)
  6966.  00h    WORD    signature 444Dh ("DM")
  6967.  02h    BYTE    command code
  6968.         53h ('S') get ??? for specified drive
  6969.  03h    WORD    result code
  6970.         (ret) 4F4Bh ("OK") if successful, else unchanged
  6971.  05h    DWORD    (ret) pointer to 96-byte ??? data
  6972.  09h    DWORD    (ret) pointer to ??? data
  6973.  0Dh  3 BYTEs    reserved
  6974. --------k-214404-----------------------------
  6975. INT 21 U - DoubleTools v1.0 - GET ???
  6976.     AX = 4404h
  6977.     BL = drive number (00h = default, 01h = A:, etc)
  6978.     CX = 0006h
  6979.     DS:DX -> DoubleTools structure (see #0876)
  6980. Return: CF clear if IOCTL successful -- check DSPACKET for actual status
  6981.         AX = number of bytes actually transferred
  6982.     CF set on error
  6983.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  6984. Note:    the Transporter device driver has the signature 55h 61h 50h 74h
  6985.       ("DaPt") twelve bytes after it beginning
  6986.  
  6987. Format of DoubleTools structure:
  6988. Offset    Size    Description    (Table 0876)
  6989.  00h    WORD    (call) signature 55h AAh
  6990.         (ret) signature 78h 70h ("xp")
  6991.  02h    WORD    (call) signature 52h 16h
  6992.         (ret) ???
  6993.  04h    WORD    (ret) segment of driver's DS (same as its PSP)
  6994. --------d-214404-----------------------------
  6995. INT 21 U - xDISK v3.31 - CONFIGURE
  6996.     AX = 4404h
  6997.     BL = drive number (00h = default, 01h = A:, etc)
  6998.     CX = 0047h (length of version string)
  6999.     DS:DX -> 79-byte buffer for version string and ???
  7000.     DS:0081h = commandline containing new switches for driver
  7001. Return: CF clear if successful
  7002.         AX = number of bytes actually transferred
  7003.     CF set on error
  7004.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  7005. Program: xDISK is a shareware resizeable EMS RAMdisk by FM de Monasterio
  7006. SeeAlso: AX=4405h"xDISK",INT 2F/AH=DDh/BX=7844h"xDISK"
  7007. --------c-214404-----------------------------
  7008. INT 21 - COMBI-disk v1.13 - GET DATA RECORD
  7009.     AX = 4404h
  7010.     BL = drive number (00h = default, 01h = A:, etc)
  7011.     CX = 0032h (length of data packet)
  7012.     DS:DX -> buffer for data packet (see #0877)
  7013. Return: CF clear if successful
  7014.         AX = number of bytes actually transferred
  7015.     CF set on error
  7016.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  7017. Program: COMBI-disk is a shareware combination cache and RAMdisk sharing a
  7018.       single pool of memory by Vadim V. Vlasov
  7019. Note:    the installation check consists of scanning the valid drives for one
  7020.       which returns a correctly-sized data packet with the proper
  7021.       signature in the first field
  7022. SeeAlso: AX=4405h"COMBI"
  7023. Index:    installation check;COMBI-disk
  7024.  
  7025. Format of COMBI-disk data packet:
  7026. Offset    Size    Description    (Table 0877)
  7027.  00h  6 BYTEs    ASCIZ signature "COMBI"
  7028.  06h    WORD    version (high byte = major, low = decimal minor version)
  7029.  08h    BYTE    current options
  7030.  09h    BYTE    sectors per allocation block
  7031.  0Ah    WORD    maximum buffer in KB
  7032.  0Ch    WORD    current buffer in KB (less than max if XMS memory being lent)
  7033.  0Eh    WORD    total number of allocation blocks
  7034.  10h    WORD    current number of allocation blocks
  7035.  12h    WORD    number of blocks being used by RAM disk
  7036.  14h    WORD    number of blocks being used by cache or unused
  7037.  16h    WORD    number of dirty cache blocks
  7038.  18h    WORD    number of blocks which could not be written out due to errors
  7039.  1Ah    WORD    total number of read requests
  7040.  1Ch    WORD    total number of sectors read
  7041.  1Eh    WORD    number of BIOS read requests (cache misses)
  7042.  20h    WORD    number of sectors read via BIOS (cache misses)
  7043.  22h    WORD    total number of write requests
  7044.  24h    WORD    total number of sectors written
  7045.  26h    WORD    number of BIOS write requests
  7046.  28h    WORD    number of sectors written via BIOS
  7047.  2Ah    WORD    number of RAM disk read requests
  7048.  2Ch    WORD    number of sectors read from RAM disk
  7049.  2Eh    WORD    number of RAM disk write requests
  7050.  30h    WORD    number of sectors written to RAM disk
  7051. --------d-214404-----------------------------
  7052. INT 21 - SFS v1.00 - GET CONFIGURATION INFORMATION
  7053.     AX = 4404h
  7054.     BL = drive number (00h = default, 01h = A:, etc)
  7055.     CX = 001Ah (length of data packet)
  7056.     DS:DX -> buffer for data packet (see #0878)
  7057. Return: CF clear if successful
  7058.         AX = number of bytes actually transferred
  7059.     CF set on error
  7060.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  7061. Program: SFS (Secure FileSystem) is a shareware encrypting disk driver by
  7062.       Peter C. Gutmann
  7063. SeeAlso: AX=4405h"SFS"
  7064.  
  7065. Format of SFS data packet:
  7066. Offset    Size    Description    (Table 0878)
  7067.  00h  4 BYTEs    signature string "SFS1"
  7068.  04h    WORD    SFS unit number (0-based)
  7069.  06h    WORD    drive on which the SFS volume is mounted
  7070.  08h    DWORD    sector offset of logical volume from start of physical volume
  7071.         0 if logical volume = physical volume
  7072.  0Ch    WORD    flag: 00h = no disk mounted, 01h = disk mounted
  7073.  0Eh    WORD    flag: 00h read/write, 01h read-only
  7074.  10h    WORD    quick-unmount hotkey
  7075.         (high byte = shift state, low = scan code) (see #0005)
  7076.  12h    WORD    auto-unmount time in minutes, or 0000h if already expired, or
  7077.         FFFFh if not set
  7078.  14h    WORD    time in minutes remaining before auto-unmount
  7079.  16h    WORD    internal driver check code
  7080.         0000h no error
  7081.         0001h driver consistency check failed
  7082.         0002h unit consistency check failed
  7083.  18h    WORD    disk access mode
  7084.         0000h BIOS
  7085.         0001h IDE direct access
  7086.         0002h SCSI direct access
  7087. --------D-214405-----------------------------
  7088. INT 21 - DOS 2+ - IOCTL - WRITE TO BLOCK DEVICE CONTROL CHANNEL
  7089.     AX = 4405h
  7090.     BL = drive number (00h = default, 01h = A:, etc)
  7091.     CX = number of bytes to write
  7092.     DS:DX -> data to write
  7093. Return: CF clear if successful
  7094.         AX = number of bytes actually written
  7095.     CF set on error
  7096.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  7097. Note:    format of data is driver-specific
  7098. SeeAlso: AX=4403h"DOS",AX=4404h"DOS",INT 2F/AX=122Bh
  7099. --------d-214405-----------------------------
  7100. INT 21 - Brian Antoine Seagate ST-01 SCSI.SYS - IOCTL - EXECUTE COMMANDS
  7101.     AX = 4405h
  7102.     BX = drive number (00h = default, 01h = A:, etc)
  7103.     CX = number of bytes to write
  7104.     DS:DX -> SCSIDISK control block (see also #0867 at AX=4403h"ST-01")
  7105. Return: CF clear if successful
  7106.         AX = number of bytes actually written
  7107.     CF set on error
  7108.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  7109. SeeAlso: AX=4403h"ST-01"
  7110. --------k-214405-----------------------------
  7111. INT 21 U - DBLSPACE.BIN - IOCTL - FLUSH OR INVALIDATE INTERNAL CACHES
  7112.     AX = 4405h
  7113.     BL = drive number (00h = default, 01h = A:, etc)
  7114.     CX = 000Ah (size of DSPACKET structure)
  7115.     DS:DX -> DSPACKET structure (see #0879)
  7116. Return: CF clear if IOCTL successful -- check DSPACKET for actual status
  7117.         AX = number of bytes actually transferred
  7118.     CF set on error
  7119.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  7120. Note:    this call is identical to the documented AX=4404h
  7121. SeeAlso: AX=4404h"DBLSPACE",INT 2F/AX=4A11h/BX=0000h
  7122.  
  7123. Format of DoubleSpace DSPACKET structure:
  7124. Offset    Size    Description    (Table 0879)
  7125.  00h    WORD    signature 444Dh ("DM")
  7126.  02h    BYTE    command code
  7127.         46h ('F') flush internal caches
  7128.         49h ('I') flush and invalidate internal caches
  7129.  03h    WORD    result code
  7130.         (ret) 4F4Bh ("OK") if successful, else unchanged
  7131.  05h  5 BYTEs    padding
  7132. --------d-214405-----------------------------
  7133. INT 21 U - xDISK v3.31 - ???
  7134.     AX = 4405h
  7135.     BL = drive number (00h = default, 01h = A:, etc)
  7136.     CX = number of bytes to write
  7137.     DS:DX -> buffer containing version string
  7138.     ???
  7139. Return: CF clear if successful
  7140.         AX = number of bytes actually transferred
  7141.     CF set on error
  7142.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  7143. Program: xDISK is a shareware resizeable EMS RAMdisk by FM de Monasterio
  7144. SeeAlso: AX=4404h"xDISK",INT 2F/AH=DDh/BX=7844h"xDISK"
  7145. --------d-214405-----------------------------
  7146. INT 21 - COMBI-disk v1.13 - CONTROL COMBI-disk
  7147.     AX = 4405h
  7148.     BL = drive number (00h = default, 01h = A:, etc) for RAM disk
  7149.     CX = number of bytes to write
  7150.     DS:DX -> buffer containing command packet (see #0881)
  7151. Return: CF clear if successful
  7152.         AX = number of bytes actually transferred
  7153.     CF set on error
  7154.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  7155. SeeAlso: AX=4404h"COMBI"
  7156.  
  7157. (Table 0880)
  7158. Values for COMBI-disk command code:
  7159.  80h    flush cache
  7160.  81h    change options byte
  7161.  82h    shrink memory
  7162.  83h    expand memory
  7163.  84h    get dirty block information
  7164.  85h    reset write errors
  7165.  86h    reset counters
  7166.  
  7167. Format of COMBI-disk command packet:
  7168. Offset    Size    Description    (Table 0881)
  7169.  00h    WORD    version
  7170.  02h    BYTE    command code (see #0880)
  7171. ---command code 80h---
  7172.  no additional fields
  7173. ---command code 81h---
  7174.  03h    BYTE    new options byte (see #0882)
  7175. ---command code 82h---
  7176.  03h    WORD    number of KB to release
  7177. ---command code 83h---
  7178.  03h    WORD    number of KB to expand
  7179. ---command code 84h---
  7180.  03h    DWORD    -> buffer for block info (see #0883)
  7181. ---command code 85h---
  7182.  03h    DWORD    block ID
  7183. ---command code 86h---
  7184.  03h    BYTE    which counters to reset
  7185.         bit 0: hard disk read counts
  7186.         bit 1: hard disk write counts
  7187.         bit 2: RAM disk read/write counts
  7188. Note:    multiple commands may be placed in a single packet by stringing
  7189.       together as many command/argument pairs as desired
  7190.  
  7191. Bitfields for COMBI-disk options byte:
  7192. Bit(s)    Description    (Table 0882)
  7193.  0    cache off
  7194.  1    cache frozen
  7195.  2    write caching enabled
  7196.  3    delayed writing disabled
  7197.  5    fix memory allocation (no XMS lending)
  7198.  6    no 'sector not found' error
  7199.  
  7200. Format of COMBI-disk block info:
  7201. Offset    Size    Description    (Table 0883)
  7202.  00h    DWORD    block ID
  7203.  04h    BYTE    bitmask of valid sectors in block
  7204.  05h    BYTE    bitmask of dirty sectors in block
  7205.  06h    BYTE    last error returned by BIOS
  7206.  07h    BYTE    number of errors
  7207. --------D-214405-----------------------------
  7208. INT 21 - SFS v1.00 - DRIVER CONTROL
  7209.     AX = 4405h
  7210.     BL = drive number (00h = default, 01h = A:, etc)
  7211.     CX = number of bytes to write
  7212.     DS:DX -> data to write (see #0885)
  7213. Return: CF clear if successful
  7214.         AX = number of bytes actually written
  7215.     CF set on error
  7216.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  7217. Program: SFS (Secure FileSystem) is a shareware encrypting disk driver by
  7218.       Peter C. Gutmann
  7219. SeeAlso: AX=4404h"SFS"
  7220.  
  7221. (Table 0884)
  7222. Values for SFS control function:
  7223.  00h    "PACKET_SET_DISKINFO"     set disk parameters
  7224.  01h    "PACKET_SET_KEYINFO"     set keying information
  7225.  02h    "PACKET_SET_READONLY"     select read/write or read-only
  7226.  03h    "PACKET_SET_DRIVENO"     set drive number to mount
  7227.  04h    "PACKET_SET_MOUNTSTATUS" set mount status
  7228.  05h    "PACKET_SET_UNMOUNT"     set/clear quick-unmount hotkey
  7229.  06h    "PACKET_SET_TIMEOUT"     set/clear auto-unmount timeout
  7230.  
  7231. Format of SFS control data packet:
  7232. Offset    Size    Description    (Table 0885)
  7233.  00h    WORD    signature 4330h ('C0')
  7234.  02h    WORD    function (see #0884)
  7235. ---function 00h---
  7236.  04h    WORD    sector size in bytes
  7237.  06h    BYTE    sectors per cluster
  7238.  07h    WORD    number of boot sectors
  7239.  09h    BYTE    number of copies of FAT
  7240.  0Ah    WORD    size of root directory in entries
  7241.  0Ch    WORD    number of sectors on disk, 16-bit
  7242.  0Eh    BYTE    media descriptor byte
  7243.  0Fh    WORD    sectors per FAT
  7244.  11h    WORD    sectors per track
  7245.  13h    WORD    number of heads
  7246.  15h    DWORD    number of hidden sectors
  7247.  19h    DWORD    number of sectors on disk, 32-bit
  7248. ---function 01h---
  7249.  04h 20 BYTEs    master IV for encrypted disk
  7250.  18h 64 BYTEs    NDC/SHS keying information
  7251. ---function 02h---
  7252.  04h    WORD    read-only state: 00h read-only, 01h read/write
  7253. ---function 03h---
  7254.  04h    WORD    drive number (see #0886)
  7255.  06h    DWORD    sector offset of logical volume from start of physical volume
  7256.         0 if logical volume = physical volume
  7257. ---function 04h---
  7258.  04h    WORD    mount status (00h unmounted, 01h mounted)
  7259. ---function 05h---
  7260.  04h    WORD    hotkey (high byte = shift state, low byte = scan code or 00h)
  7261.         (see #0005)
  7262.         0000h to disable hotkey
  7263. ---function 06h---
  7264.  04h    WORD    timeout in minutes before automatic unmount
  7265.         0000h to disable auto-unmount
  7266. Notes:    the data for function 00h corresponds to a DOS BPB (see AH=53h)
  7267.     functions 00h, 01h, and 03h automatically unmount the encrypted drive
  7268.     unmounting a drive with function 04h also destroys the encryption
  7269.       information in the driver and forces all dirty buffers to be flushed
  7270.  
  7271. Bitfields for SFS drive number:
  7272. Bit(s)    Description    (Table 0886)
  7273.  15-12    drive access mode
  7274.     0000 BIOS access
  7275.     0001 direct IDE access
  7276.     0010 direct SCSI access
  7277. ---if BIOS access---
  7278.  11-8    unused (0)
  7279.  7-0    BIOS drive number
  7280. ---if IDE access---
  7281.  11-8    unused (0)
  7282.  7-0    IDE drive number
  7283. ---if SCSI access---
  7284.  11-8    SCSI host number
  7285.  7-4    SCSI target ID
  7286.  3-0    SCSI logical unit number
  7287. --------D-214406-----------------------------
  7288. INT 21 - DOS 2+ - IOCTL - GET INPUT STATUS
  7289.     AX = 4406h
  7290.     BX = file handle
  7291. Return: CF clear if successful
  7292.         AL = input status
  7293.         00h not ready (device) or at EOF (file)
  7294.         FFh ready
  7295.     CF set on error
  7296.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  7297. Note:    files may not register as being at EOF if positioned there by AH=42h
  7298. SeeAlso: AX=4407h,INT 2F/AX=122Bh
  7299. --------D-214407-----------------------------
  7300. INT 21 - DOS 2+ - IOCTL - GET OUTPUT STATUS
  7301.     AX = 4407h
  7302.     BX = file handle
  7303. Return: CF clear if successful
  7304.         AL = input status
  7305.         00h not ready
  7306.         FFh ready
  7307.     CF set on error
  7308.         AX = error code (01h,05h,06h,0Dh) (see #1020 at AH=59h/BX=0000h)
  7309. Note:    for DOS 2+, files are always ready for output, even if the disk is
  7310.       full or no media is in the drive
  7311. SeeAlso: AX=4406h,INT 2F/AX=122Bh
  7312. --------D-214408-----------------------------
  7313. INT 21 - DOS 3.0+ - IOCTL - CHECK IF BLOCK DEVICE REMOVABLE
  7314.     AX = 4408h
  7315.     BL = drive number (00h = default, 01h = A:, etc)
  7316. Return: CF clear if successful
  7317.         AX = media type (0000h removable, 0001h fixed)
  7318.     CF set on error
  7319.         AX = error code (01h,0Fh) (see #1020 at AH=59h/BX=0000h)
  7320. Note:    in addition to the normal operation, if Stacker is installed, this
  7321.       call also sets the volume number at offset 58h in the Stacker
  7322.       device driver (except under DR DOS 3.41-5.0, which do not pass
  7323.       through this call to the driver; use AX=440Eh instead)
  7324.       (see AX=4404h"Stacker",AX=440Eh,INT 25/AX=CDCDh)
  7325. SeeAlso: AX=4400h,AX=4404h"Stacker",AX=4409h,INT 2F/AX=122Bh
  7326. --------D-214409-----------------------------
  7327. INT 21 - DOS 3.1+ - IOCTL - CHECK IF BLOCK DEVICE REMOTE
  7328.     AX = 4409h
  7329.     BL = drive number (00h = default, 01h = A:, etc)
  7330. Return: CF clear if successful
  7331.         DX = device attribute word
  7332.         bit 15: drive is SUBSTituted
  7333.         bit 12: drive is remote
  7334.         bit  9: direct I/O not allowed
  7335.     CF set on error
  7336.         AX = error code (01h,0Fh) (see #1020 at AH=59h/BX=0000h)
  7337. Note:    on local drives, DX bits not listed above are the attribute word from
  7338.       the device driver header (see #0987 at AH=52h); for remote drives,
  7339.       the other bits appear to be undefined for DOS versions prior to 5.0
  7340.       (they are all cleared in DOS 5+)
  7341.     checking whether DX=0800h on return appears to be a fairly reliable
  7342.       method for detecting Microsoft's RAMDRIVE, though not for other
  7343.       ramdisks (there appears to be no simple yet foolproof method for
  7344.       detecting ramdisks, although the presence of only a single copy of
  7345.       the FAT and only a single head on non-removable devices is a fairly
  7346.       good indicator)
  7347. SeeAlso: AX=4400h,AX=4408h,AX=440Ah,INT 2F/AX=122Bh
  7348. --------D-21440A-----------------------------
  7349. INT 21 - DOS 3.1+ - IOCTL - CHECK IF HANDLE IS REMOTE
  7350.     AX = 440Ah
  7351.     BX = handle
  7352. Return: CF clear if successful
  7353.         DX = attribute word (as stored in SFT)
  7354.         bit 15: set if remote
  7355.         bit 14: date/time not set on close
  7356.     CF set on error
  7357.         AX = error code (01h,06h) (see #1020 at AH=59h/BX=0000h)
  7358. Notes:    if file is remote, Novell Advanced NetWare 2.0 returns the number of
  7359.       the file server on which the handle is located in CX
  7360.     DR DOS 3.41 and 5.0 clear all bits of DX except bit 15
  7361. SeeAlso: AX=4400h,AX=4409h,AH=52h,INT 2F/AX=122Bh
  7362. --------D-21440B-----------------------------
  7363. INT 21 - DOS 3.1+ - IOCTL - SET SHARING RETRY COUNT
  7364.     AX = 440Bh
  7365.     CX = pause between retries (default 1)
  7366.     DX = number of retries (default 3)
  7367. Return: CF clear if successful
  7368.     CF set on error
  7369.         AX = error code (01h) (see #1020 at AH=59h/BX=0000h)
  7370. Notes:    delay is dependent on processor speed (value in CX specifies number of
  7371.       64K-iteration empty loops to execute)
  7372.     if DX=0000h on entry, the retry count is left unchanged
  7373. SeeAlso: AH=52h,INT 2F/AX=1224h,INT 2F/AX=122Bh
  7374. --------D-21440C-----------------------------
  7375. INT 21 - DOS 3.2+ - IOCTL - GENERIC CHARACTER DEVICE REQUEST
  7376.     AX = 440Ch
  7377.     BX = device handle
  7378.     CH = category code (see #0887)
  7379.     CL = function number (see #0888)
  7380.     DS:DX -> parameter block (see #0889,#0890,#0891,#0892,#0893,#0894)
  7381.     SI = parameter to pass to driver (European MS-DOS 4.0, OS/2 comp box)
  7382.     DI = parameter to pass to driver (European MS-DOS 4.0, OS/2 comp box)
  7383. Return: CF set on error
  7384.         AX = error code (see #1020 at AH=59h/BX=0000h)
  7385.     CF clear if successful
  7386.         DS:DX -> iteration count if CL=65h
  7387.         SI = returned value (European MS-DOS 4.0, OS/2 comp box)
  7388.         DI = returned value (European MS-DOS 4.0, OS/2 comp box)
  7389. Note:    DR DOS 3.41 and 5.0 return error code 16h on CL=45h,65h if the device
  7390.       does not support a retry counter
  7391. SeeAlso: AX=440Dh"DOS 3.2+",INT 2F/AX=0802h,INT 2F/AX=122Bh,INT 2F/AX=14FFh
  7392. SeeAlso: INT 2F/AX=1A01h
  7393.  
  7394. (Table 0887)
  7395. Values for IOCTL category code:
  7396.  00h    unknown (DOS 3.3+)
  7397.  01h    COMn: (DOS 3.3+)
  7398.  03h    CON (DOS 3.3+)
  7399.  05h    LPTn:
  7400.  9Eh    Media Access Control driver (STARLITE)
  7401.  00h-7Fh reserved for Microsoft
  7402.  80h-FFh reserved for OEM/user-defined
  7403.  
  7404. (Table 0888)
  7405. Values for generic character IOCTL function:
  7406.  00h    MAC driver Bind (STARLITE) (see #0889)
  7407.  45h    set iteration (retry) count (see #0890)
  7408.  4Ah    select code page (see #0891)
  7409.  4Ch    start code-page preparation (see #0892)
  7410.  4Dh    end code-page preparation (see #0893)
  7411.  5Fh    set display information (DOS 4.0+) (see #0894)
  7412.  65h    get iteration (retry) count
  7413.  6Ah    query selected code page (see #0891)
  7414.  6Bh    query prepare list (see #0895)
  7415.  7Fh    get display information (DOS 4.0+) (see #0894)
  7416. Note:    bit assignments for function code:
  7417.         bit 7: set to ignore if unsupported, clear to return error
  7418.         bit 6: set if passed to driver, clear if intercepted by DOS
  7419.         bit 5: set if queries data from device, clear if sends command
  7420.         bits 4-0: subfunction
  7421.  
  7422. Format of parameter block for function 00h:
  7423. Offset    Size    Description    (Table 0889)
  7424.  00h  8 BYTEs    ASCIZ signature "STARMAC"
  7425.  08h    WORD    version
  7426.  0Ah    WORD    flags
  7427.         bit 0: media requires connect or listen request before use
  7428.         bit 1: network is a LAN (broadcast/multicast supported)
  7429.         bit 2: point-to-point network
  7430.  0Ch    WORD    handle for use with MAC driver's private interface (filled in
  7431.         by MAC driver)
  7432.  0Eh    WORD    context
  7433.  10h    WORD    approximate speed in KB/sec (filled in by MAC driver)
  7434.  12h    WORD    approximate cost in cents per hour (filled in by MAC driver)
  7435.  14h    WORD    maximum packet size in bytes (filled in by MAC driver)
  7436.  16h    WORD    addressing format (filled in by MAC driver)
  7437.         0000h general addressing
  7438.         0001h Ethernet addressing
  7439.         0002h Token Ring addressing
  7440.         0003h Token Bus addressing
  7441.  18h    DWORD    Send entry point (filled in by MAC driver)
  7442.  1Ch    DWORD    RegisterEventHandler entry point (filled in by MAC driver)
  7443.  20h    DWORD    SetPacketFilter entry point (filled in by MAC driver)
  7444.  24h    DWORD    UnBind entry point (filled in by MAC driver)
  7445.  
  7446. Format of parameter block for function 45h:
  7447. Offset    Size    Description    (Table 0890)
  7448.  00h    WORD    number of times output is attempted before driver assumes
  7449.           device is busy
  7450.  
  7451. Format of parameter block for functions 4Ah and 6Ah:
  7452. Offset    Size    Description    (Table 0891)
  7453.  00h    WORD    length of data
  7454.  02h    WORD    code page ID (see #1099 at INT 21/AX=6602h)
  7455.  04h 2N BYTEs    DCBS (double byte character set) lead byte range
  7456.           start/end for each of N ranges (DOS 4.0)
  7457.     WORD    0000h  end of data (DOS 4.0)
  7458.  
  7459. Format of parameter block for function 4Ch:
  7460. Offset    Size    Description    (Table 0892)
  7461.  00h    WORD    flags
  7462.         DISPLAY.SYS = 0000h
  7463.         PRINTER.SYS bit 0 clear to prepare downloaded font, set to
  7464.             prepare cartridge selection
  7465.  02h    WORD    length of remainder of parameter block
  7466.  04h    WORD    number of code pages following
  7467.  06h  N WORDs    code page 1,...,N
  7468.  
  7469. Format of parameter block for function 4Dh:
  7470. Offset    Size    Description    (Table 0893)
  7471.  00h    WORD    length of data
  7472.  02h    WORD    code page ID (see #1099 at INT 21/AX=6602h)
  7473.  
  7474. Format of parameter block for functions 5Fh and 7Fh:
  7475. Offset    Size    Description    (Table 0894)
  7476.  00h    BYTE    level (0 for DOS 4.x-6.0)
  7477.  01h    BYTE    reserved (0)
  7478.  02h    WORD    length of following data (14)
  7479.  04h    WORD    control flags
  7480.         bit 0 set for blink, clear for intensity
  7481.         bits 1-15 reserved
  7482.  06h    BYTE    mode type (1=text, 2=graphics)
  7483.  07h    BYTE    reserved (0)
  7484.  08h    WORD    colors
  7485.         0000h = monochrome
  7486.         else N bits per pixel
  7487.  0Ah    WORD    pixel columns
  7488.  0Ch    WORD    pixel rows
  7489.  0Eh    WORD    character columns
  7490.  10h    WORD    character rows
  7491.  
  7492. Format of parameter block for function 6Bh:
  7493. Offset    Size    Description    (Table 0895)
  7494.  00h    WORD    length of following data
  7495.  02h    WORD    number of hardware code pages
  7496.  04h  N WORDs    hardware code pages 1,...,N
  7497.     WORD    number of prepared code pages
  7498.       N WORDs    prepared code pages 1,...,N
  7499. --------d-21440C-----------------------------
  7500. INT 21 - Greg Shenaut ASPITAPE.SYS - INTERFACE
  7501.     AX = 440Ch
  7502.     BX = device handle
  7503.     CH = category code
  7504.         07h tape (ASPITAPE.SYS)
  7505.     CL = function
  7506.         01h "mtop" - perform tape operation
  7507.         02h "mtget" - get tape status
  7508.         03h ignore end-of-tape errors
  7509.         04h enable end-of-tape errors
  7510.     DS:DX -> parameter block (see #0896,#0897)
  7511. Return: CF set on error
  7512.         AX = error code (see #1020 at AH=59h/BX=0000h)
  7513.     CF clear if successful
  7514.         DS:DX -> data block
  7515. Notes:    This device driver is a simple DOS interface to the Adaptec Advanced
  7516.       SCSI Programming Interface (ASPI).  It provides the following device
  7517.       names as access to the SCSI tape, 'RMTx' (rewind on close) and
  7518.       'NRMTx' (NO rewind on close) where x can go from 0 to 3.  There may
  7519.       also be the following names 'MTx' and 'NMTx' which default to 1024
  7520.       byte blocks.    The names may also have a '$' appended to try and make
  7521.       them unique from file names of 'RMT0' etc.
  7522.     once opend these devices must be put into RAW mode
  7523. SeeAlso: AX=4402h"ASPI"
  7524.  
  7525. Format of ASPITAPE.SYS mtop parameter block:
  7526. Offset    Size    Description    (Table 0896)
  7527.  00h    WORD    operation code
  7528.         00h "MTWEOF" - write an end-of-file record
  7529.         01h "MTFSF" - forward space file
  7530.         02h "MTBSF" - backward space file
  7531.         03h "MTFSR" - forward space record
  7532.         04h "MTBSR" - backward space record
  7533.         05h "MTREW" - rewind
  7534.         06h "MTOFFL" - rewind and unload
  7535.         07h "MTNOP" - perform TEST UNIT READY
  7536.  02h    DWORD    repetition count
  7537.  
  7538. Format of ASPITAPE.SYS mtget parameter block:
  7539. Offset    Size    Description    (Table 0897)
  7540.  00h    BYTE    ASPI host ID
  7541.  01h    BYTE    SCSI target ID
  7542.  02h    BYTE    SCSI logical unit number
  7543.  03h    BYTE    device parameters
  7544.         bit 0: drive must use fixed-block read and write
  7545.         bit 7: drive is an ASPI device
  7546.  04h    BYTE    current device state (see #0898)
  7547.  05h    BYTE    unit number within driver
  7548.  06h    WORD    fixed block blocksize
  7549.  08h    BYTE    last SCSI status
  7550.  09h    BYTE    last SCSI sense key
  7551.  0Ah    WORD    last SCSI opcode (packed) (see #0899)
  7552.  0Ch    WORD    residual bytes from SCSI opcode
  7553.  
  7554. Bitfields for ASPITAPE.SYS current device state:
  7555. Bit(s)    Description    (Table 0898)
  7556.  0    device currently opened in buffered mode
  7557.  1    drive currently opened in nonbuffered mode
  7558.  2    rewind drive on last close
  7559.  3    drive has been written on
  7560.  4    drive has been read from
  7561.  5    next read will return 0 bytes
  7562.  6    EOM will resemble EOF
  7563.  7    drive may be busy rewinding
  7564.  
  7565. Bitfields for SCSI opcode:
  7566. Bit(s)    Description    (Table 0899)
  7567.  0-7    SCSI operation (SCSI packet byte 0)
  7568.  8-10    SCSI flags (SCSI packet byte 1)
  7569.  11-12    ASPI "Direction Bits" (ASPI SRB byte 3)
  7570. --------D-21440D-----------------------------
  7571. INT 21 - DOS 3.2+ - IOCTL - GENERIC BLOCK DEVICE REQUEST
  7572.     AX = 440Dh
  7573.     BL = drive number (00h=default,01h=A:,etc)
  7574.     CH = category code (see #0900)
  7575.     CL = minor code (function) (see #0901)
  7576.     DS:DX -> (DOS) parameter block (see #0902,#0904,#0905,#0906,#0907)
  7577.     SI:DI -> (OS/2 comp box) parameter block (see #0908,#0910,#0911,#0914)
  7578. Return: CF set on error
  7579.         AX = error code (01h,02h,etc.) (see #1020 at AH=59h/BX=0000h)
  7580.     CF clear if successful
  7581.         DS:DX -> data block if CL=60h or CL=61h
  7582. Notes:    DOS 4.01 seems to ignore the high byte of the number of directory
  7583.       entries in the BPB for diskettes.
  7584.     functions 46h and 66h undocumented in DOS 4.x, documented for DOS 5+
  7585.     the DUBLDISK.SYS v2.6 driver only supports minor codes 60h and 67h
  7586.     DR DOS 3.41-6.0 only support minor codes 40h-42h and 60h-62h; all
  7587.       other minor codes return error code 16h
  7588.     some PCMCIA calls reportedly appear to be dangerous for MS-DOS versions
  7589.       prior to 5.0
  7590.     minor code 60h normally produces no I/O except with AutoMount=1 for
  7591.       DBLSPACE/DRVSPACE
  7592. SeeAlso: AX=440Ch,AX=440Dh/CX=084Ah,AX=440Dh/CX=0871h,AH=69h,INT 2F/AX=0802h
  7593. SeeAlso: INT 2F/AX=122Bh
  7594.  
  7595. (Table 0900)
  7596. Values for block device IOCTL category code:
  7597.  08h    disk drive
  7598.  48h    FAT32 disk drive
  7599.  00h-7Fh reserved for Microsoft
  7600.  80h-FFh reserved for OEM/user-defined
  7601.  
  7602. (Table 0901)
  7603. Values for generic block IOCTL minor code:
  7604.  00h    (OS/2)    \ used to lock/unlock a drive
  7605.  01h    (OS/2)    /
  7606.  40h    set device parameters (see #0902)
  7607.  41h    write logical device track (see #0904)
  7608.  42h    format and verify logical device track (see #0905)
  7609.  46h    (DOS 4.0+) set volume serial number (see #0907,AH=69h)
  7610.  47h    (DOS 4.0+) set access flag (see #0908)
  7611.  48h    (Enh. Disk Drive Spec) set media lock state (see #0909,INT 13/AH=45h)
  7612.  49h    (Enh. Disk Drive Spec) eject media in drive (see INT 13/AH=49h)
  7613.     no parameter block required
  7614.  4Ah    (MS-DOS 7.0) lock logical volume (see AX=440Dh/CX=084Ah)
  7615.  4Bh    (MS-DOS 7.0) lock physical volume (see AX=440Dh/CX=084Bh)
  7616.  50h    (PCMCIA) attribute memory write
  7617.  51h    (PCMCIA) common memory write
  7618.  52h    (PCMCIA) force media change (DOS 5+ ???) (see #0910)
  7619.  53h    (PCMCIA) erase drive
  7620.  54h    (PCMCIA) erase media
  7621.  56h    (PCMCIA) set erase status callback
  7622.  57h    (PCMCIA) append Card Information Structure (CIS) tuple
  7623.  58h    (PCMCIA) erase CIS tuples
  7624.  60h    get device parameters (see #0902)
  7625.  61h    read logical device track (see #0904)
  7626.  62h    verify logical device track (see #0906)
  7627.  66h    (DOS 4.0+) get volume serial number (see #0907,AH=69h)
  7628.  67h    (DOS 4.0+) get access flag (see #0908)
  7629.  68h    (DOS 5.0+) sense media type (see #0911)
  7630.  6Ah    (MS-DOS 7.0) unlock logical volume (see AX=440Dh/CX=086Ah)
  7631.     no parameter block required
  7632.  6Bh    (MS-DOS 7.0) unlock physical volume (see AX=440Dh/CX=086Bh)
  7633.     no parameter block required
  7634.  6Ch    (MS-DOS 7.0) get lock flag (see AX=440Dh/CX=086Ch)
  7635.     no parameter block required
  7636.  6Dh    (MS-DOS 7.0) enumerate open files (see AX=440Dh/CX=086Dh)
  7637.  6Eh    (MS-DOS 7.0) find swap file (see AX=440Dh/CX=086Eh)
  7638.  6Fh    (MS-DOS 7.0) get drive map information (see #0912)
  7639.  70h    (PCMCIA) attribute memory read
  7640.  70h    (MS-DOS 7.0) get current lock state (see AX=440Dh/CX=0870h)
  7641.     no parameter block required
  7642.  71h    (MS-DOS 7.0) get first cluster (see AX=440Dh/CX=0871h)
  7643.  73h    (PCMCIA) get memory media information (DOS 5+ ???) (see #0914)
  7644.  76h    (PCMCIA) get erase status callback
  7645.  77h    (PCMCIA) get first Card Information Structure (CIS) tuple
  7646.  78h    (PCMCIA) get next CIS tuple
  7647.  7Fh    (PCMCIA) get ??? information (see #0915,#0916)
  7648.  
  7649. Format of parameter block for functions 40h, 60h:
  7650. Offset    Size    Description    (Table 0902)
  7651.  00h    BYTE    special functions
  7652.         bit 0 set if function to use current BPB, clear if Device
  7653.               BIOS Parameter Block field contains new default BPB
  7654.         bit 1 set if function to use track layout fields only
  7655.             must be clear if CL=60h
  7656.         bit 2 set if all sectors in track same size (should be set)
  7657.         bits 3-7 reserved (MS-DOS, Novell DOS 7)
  7658.         bit 5: skip head settling time (WinDOS 2.11)
  7659.         bit 6: format access flag (WinDOS 2.11)
  7660.  01h    BYTE    device type (see #0903)
  7661.  02h    WORD    device attributes
  7662.         bit 0 set if nonremovable medium
  7663.         bit 1 set if door lock ("changeline") supported
  7664.         bits 2-15 reserved
  7665.  04h    WORD    number of cylinders
  7666.  06h    BYTE    media type
  7667.         for 1.2M drive
  7668.             00h 1.2M disk (default)
  7669.             01h 320K/360K disk
  7670.         F8h for DUBLDISK.SYS v2.6 expanded drives
  7671.         always 00h for other drive types
  7672.  07h 31 BYTEs    device BPB (see #1004 at AH=53h), bytes after BPB offset 1Eh
  7673.           omitted; final six bytes only transferred on function 40h
  7674.           with BYTE 00h bit 0 set for MS-DOS 5.0
  7675. ---function 40h only---
  7676.  26h    WORD    number of sectors per track (start of track layout field)
  7677.         (maximum 63)
  7678.  28h  N word pairs: number,size of each sector in track
  7679. ---category code 48h (FAT32), function 40h---
  7680.  07h 53 BYTEs    extended BPB (see #3300)
  7681.  3Ch 32 BYTEs    reserved
  7682.  5Ch    WORD    number of track table entries
  7683.  5Eh 2N WORDs    sector table (word pairs: number/size of each sector in track)
  7684. ---category code 48h (FAT32), function 60h---
  7685.  07h 53 BYTEs    extended BPB (see #3300)
  7686.  3Ch 32 BYTEs    reserved
  7687.  
  7688. (Table 0903)
  7689. Values for device type:
  7690.  00h    320K/360K disk
  7691.  01h    1.2M disk
  7692.  02h    720K disk
  7693.  03h    single-density 8-inch disk
  7694.  04h    double-density 8-inch disk
  7695.  05h    fixed disk
  7696.  06h    tape drive
  7697.  07h    (DOS 3.3+) other type of block device, normally 1.44M floppy
  7698.  08h    read/write optical disk
  7699.  09h    (DOS 5+) 2.88M floppy
  7700.  
  7701. Format of parameter block for functions 41h, 61h:
  7702. Offset    Size    Description    (Table 0904)
  7703.  00h    BYTE    special functions (reserved, must be zero)
  7704.  01h    WORD    number of disk head
  7705.  03h    WORD    number of disk cylinder
  7706.  05h    WORD    number of first sector to read/write
  7707.  07h    WORD    number of sectors
  7708.  09h    DWORD    transfer address
  7709. Note:    under Windows95, a volume must be locked (see AX=440Dh/CX=084Bh) in
  7710.       order to perform direct accesses such as track reads and writes
  7711.       with this IOCTL function
  7712.  
  7713. Format of parameter block for function 42h:
  7714. Offset    Size    Description    (Table 0905)
  7715.  00h    BYTE    reserved, must be zero (DOS <3.2)
  7716.           bit 0=0: format/verify track
  7717.             1: format status call (DOS 3.2+), don't actually format
  7718.           bit 1: format multiple tracks, require additional WORD
  7719.               (hard disks only)
  7720.           bits 2-7 reserved, must be zero
  7721.         value on return (DOS 3.3+):
  7722.           00h    specified tracks, sectors/track supported by BIOS
  7723.           01h    function not supported by BIOS
  7724.           02h    specified tracks, sectors/track not allowed for drive
  7725.           03h    no disk in drive
  7726.  01h    WORD    number of disk head
  7727.  03h    WORD    number of disk cylinder
  7728. ---BYTE 00h bit 1 set---
  7729.  05h    WORD    number of tracks to format
  7730.  
  7731. Format of parameter block for function 62h:
  7732. Offset    Size    Description    (Table 0906)
  7733.  00h    BYTE    reserved, must be zero (DOS <3.2)
  7734.           bit 0=0: verify single track
  7735.             1: verify multiple tracks
  7736.           bits 1-7 reserved, must be zero
  7737.         value on return (DOS 3.3+):
  7738.           00h    specified tracks, sectors/track supported by BIOS
  7739.           01h    function not supported by BIOS
  7740.           02h    specified tracks, sectors/track not allowed for drive
  7741.           03h    no disk in drive
  7742.  01h    WORD    number of disk head
  7743.  03h    WORD    number of disk cylinder
  7744.  05h    WORD    number of tracks to verify (equivalent to 255 or fewer sectors)
  7745.  
  7746. Format of parameter block for functions 46h, 66h:
  7747. Offset    Size    Description    (Table 0907)
  7748.  00h    WORD    (call) info level (should be 0000h)
  7749.  02h    DWORD    disk serial number (binary)
  7750.  06h 11 BYTEs    volume label or "NO NAME    "
  7751.  11h  8 BYTEs    filesystem type "FAT12     " or "FAT16   "
  7752.           (generally CL=66h only, but MS-DOS 5.0 will write the
  7753.           given filesystem type to the disk)
  7754.  
  7755. Format of parameter block for functions 47h, 67h:
  7756. Offset    Size    Description    (Table 0908)
  7757.  00h    BYTE    special-function field (must be zero)
  7758.  01h    BYTE    disk-access flag, nonzero if access allowed by driver
  7759.  
  7760. Format of parameter block for function 48h:
  7761. Offset    Size    Description    (Table 0909)
  7762.  00h    BYTE    (call) locking operation
  7763.         00h lock media in drive
  7764.         01h unlock media
  7765.         02h get locking status
  7766.  01h    BYTE    (ret) drive's lock status (number of pending locks on drive)
  7767. Note:    also supported by MS-DOS 7.0
  7768.  
  7769. Format of parameter block for function 52h:
  7770.  00h    BYTE    (call) unused???    (Table 0910)
  7771.         (ret) 00h if flash/ATA drive but no card inserted
  7772.             unchanged otherwise
  7773. Notes:    the absense of a flash card should be tested by checking the DOS error
  7774.       code rather than the returned byte
  7775.     the parameter byte is cleared to 00h erroneously by the Award
  7776.       PCDISK.EXE v1.02c PCMCIA/ATA driver if no ATA card is inserted
  7777.       (bug corrected in PCDISK.EXE v1.02h and later)
  7778.     not supported by the SystemSoft ATADRV.EXE and the Phoenix PCMATA.SYS
  7779.       PCMCIA/ATA drivers
  7780.  
  7781. Format of parameter block for function 68h:
  7782. Offset    Size    Description    (Table 0911)
  7783.  00h    BYTE    01h for default media type, 00h for any other media type
  7784.         (see also INT 13/AH=20h"Compaq")
  7785.  01h    BYTE    02h for 720K, 07h for 1.44M, 09h for 2.88M
  7786.  
  7787. Format of parameter block for function 6Fh:
  7788. Offset    Size    Description    (Table 0912)
  7789.  00h    BYTE    (call) length of this buffer (in bytes)
  7790.  01h    BYTE    (ret) number of bytes in parameter block actually used
  7791.  02h    BYTE    (ret) drive flags (see #0913)
  7792.  03h    BYTE    (ret) physical drive number
  7793.         00h-7Fh floppy
  7794.         80h-FEh hard
  7795.         FFh no physical drive
  7796.  04h    DWORD    (ret) bitmap of logical drives associated with physical drive
  7797.         bit 0 = drive A:, etc.
  7798.  08h    QWORD    (ret) relative block address of partition start
  7799.  
  7800. Bitfields for Get Drive Map Information drive flags:
  7801. Bit(s)    Description    (Table 0913)
  7802.  0    protected-mode driver for logical drive
  7803.  1    protected-mode driver in use for physical drive corresponding to the
  7804.       logical drive
  7805.  2    drive available only in protected mode
  7806.  3    protected-mode drive supports media ejection
  7807.  4    drive issues media insertion and removal notifications
  7808. SeeAlso: #0912
  7809.  
  7810. Format of parameter block for function 73h:
  7811. Offset    Size    Description    (Table 0914)
  7812.  00h    BYTE    ???
  7813.         00h ATA card inserted ???
  7814.         80h ATA card not inserted ???
  7815.  01h    BYTE    length of parameter block ???
  7816.         apparently always 40h
  7817.  02h    BYTE    ???
  7818.         00h ATA card not inserted ???
  7819.         0Dh ATA card inserted ???
  7820.  03h  2 BYTEs    ??? (apparently always 00h)
  7821.  05h    BYTE    drive number (0=first) ???
  7822.  06h    BYTE    total number of drives ???
  7823.  07h    BYTE    ???
  7824.         00h ATA card not inserted ???
  7825.         01h ATA card inserted ???
  7826.  08h 17 BYTEs    ???
  7827.  19h    BYTE    ???
  7828.         00h ATA card not inserted ???
  7829.         01h ATA card inserted ???
  7830.  1Ah    BYTE    ??? (apparently always 01h)
  7831.  1Bh    BYTE    ???
  7832.         00h ATA card not inserted ???
  7833.         01h ATA card inserted ???
  7834.  1Ch  2 BYTEs    ??? (apparently always 0015h)
  7835.  1Eh  2 BYTEs    ???
  7836.  20h  2 BYTEs    ??? (apparently always 0110h)
  7837.  22h 15 BYTEs    ???
  7838.  31h  2 BYTEs    ??? (apparently always 7000h)
  7839.  33h 11 BYTEs    driver signature
  7840.         "AWARD PDISK" for Award PCDISK.EXE PCMCIA/ATA driver
  7841.         "MS-BIOS    " for HP 200LX generic ATA driver
  7842.  3Eh  2 BYTEs    ???
  7843. Notes:    parameter structure possibly depends on driver
  7844.     this function is not supported by the SystemSoft ATADRV.EXE and the
  7845.       Phoenix PCMATA.SYS PCMCIA/ATA drivers
  7846.  
  7847. Format of parameter block for function 7Fh for SystemSoft ATADRV.EXE:
  7848. Offset    Size    Description    (Table 0915)
  7849.  00h    DWORD    -> unknown location within driver
  7850. Note:    function supported by the SystemSoft ATADRV.EXE PCMCIA/ATA driver
  7851.       but not by the Award PCDISK.EXE PCMCIA/ATA driver
  7852. SeeAlso: #0916
  7853.  
  7854. Format of parameter block for function 7Fh for Phoenix PCMATA.SYS:
  7855. Offset    Size    Description    (Table 0916)
  7856.  00h  8 BYTEs    ???
  7857. Note:    this function supported by the Phoenix PCMATA.SYS PCMCIA/ATA driver
  7858.       but not by the Award PCDISK.EXE PCMCIA/ATA driver
  7859. SeeAlso: #0915
  7860. --------D-21440DCX084A-----------------------
  7861. INT 21 - MS-DOS 7.0 - GENERIC IOCTL - LOCK LOGICAL VOLUME
  7862.     AX = 440Dh
  7863.     CX = 084Ah (category code 08h, minor code 4Ah)
  7864.     BL = drive number (00h=default,01h=A:,etc)
  7865.     BH = lock level (00h-03h)
  7866.     DX = drive permissions (see #0917) for Level 1 lock or second
  7867.         Level 0 lock when formatting
  7868. Return: CF set on error
  7869.         AX = error code (01h,02h,etc.) (see #1020 at AH=59h/BX=0000h)
  7870.     CF clear if successful
  7871. Note:    the logical volume must be locked before direct disk accesses are
  7872.       permitted by Windows95
  7873. SeeAlso: AX=440Dh"DOS 3.2+",AX=440Dh/CX=084Bh,AX=440Dh/CX=086Ah
  7874. SeeAlso: AX=440Dh/CX=086Ch
  7875.  
  7876. Bitfields for drive permissions:
  7877. Bit(s)    Description    (Table 0917)
  7878.  0    allow writes
  7879.  1    disallow new file mappings
  7880.  2    volume locked for formatting
  7881. --------D-21440DCX084B-----------------------
  7882. INT 21 - MS-DOS 7.0 - GENERIC IOCTL - LOCK PHYSICAL VOLUME
  7883.     AX = 440Dh
  7884.     CX = 084Bh (category code 08h, minor code 4Bh)
  7885.     BL = physical drive number (00h-7Fh = floppy, 80h-FFh = hard disk)
  7886.     BH = lock level (00h-03h)
  7887.     DX = drive permissions (see #0917) for Level 1 lock or second
  7888.         Level 0 lock when formatting
  7889. Return: CF set on error
  7890.         AX = error code (01h,02h,etc.) (see #1020 at AH=59h/BX=0000h)
  7891.     CF clear if successful
  7892. Note:    the physical volume must be locked before direct disk writes via
  7893.       INT 13 are permitted by Windows95
  7894. SeeAlso: AX=440Dh"DOS 3.2+",AX=440Dh/CX=084Ah,AX=440Dh/CX=086Bh
  7895. SeeAlso: AX=440Dh/CX=086Ch
  7896. --------D-21440DCX086A-----------------------
  7897. INT 21 - MS-DOS 7.0 - GENERIC IOCTL - UNLOCK LOGICAL VOLUME
  7898.     AX = 440Dh
  7899.     CX = 086Ah (category code 08h, minor code 6Ah)
  7900.     BL = drive number (00h=default,01h=A:,etc)
  7901. Return: CF set on error
  7902.         AX = error code (01h,02h,etc.) (see #1020 at AH=59h/BX=0000h)
  7903.     CF clear if successful
  7904. Note:    the logical volume must be locked before direct disk accesses via
  7905.       INT 13 are permitted by Windows95
  7906. SeeAlso: AX=440Dh"DOS 3.2+",AX=440Dh/CX=084Ah,AX=440Dh/CX=086Bh
  7907. --------D-21440DCX086B-----------------------
  7908. INT 21 - MS-DOS 7.0 - GENERIC IOCTL - UNLOCK PHYSICAL VOLUME
  7909.     AX = 440Dh
  7910.     CX = 086Bh (category code 08h, minor code 6Bh)
  7911.     BL = physical drive number (00h-7Fh = floppy, 80h-FFh = hard disk)
  7912. Return: CF set on error
  7913.         AX = error code (01h,02h,etc.) (see #1020 at AH=59h/BX=0000h)
  7914.     CF clear if successful
  7915. SeeAlso: AX=440Dh"DOS 3.2+",AX=440Dh/CX=084Bh,AX=440Dh/CX=086Ah
  7916. --------D-21440DCX086C-----------------------
  7917. INT 21 - MS-DOS 7.0 - GENERIC IOCTL - GET LOCK FLAG STATE
  7918.     AX = 440Dh
  7919.     CX = 086Ch (category code 08h, minor code 6Ch)
  7920.     BL = drive number (00h=default,01h=A:,etc)
  7921. Return: CF set on error
  7922.         AX = error code (01h,02h,etc.) (see #1020 at AH=59h/BX=0000h)
  7923.     CF clear if successful
  7924.         AX = access flag (see #0918)
  7925. SeeAlso: AX=440Dh"DOS 3.2+",AX=440Dh/CX=084Ah,AX=440Dh/CX=084Bh
  7926. SeeAlso: AX=440Dh/CX=0870h
  7927.  
  7928. (Table 0918)
  7929. Values for drive access flag:
  7930.  0000h    no writes/file mappings since last call
  7931.  0001h    write operation has occurred since last call
  7932.  0002h    file mapping has occurred since last call
  7933. Note:    function 6Ch resets the access flag every time it is called
  7934. --------D-21440DCX086D-----------------------
  7935. INT 21 - MS-DOS 7.0 - GENERIC IOCTL - ENUMERATE OPEN FILES
  7936.     AX = 440Dh
  7937.     CX = 086Dh (category code 08h, minor code 6Dh)
  7938.     BL = drive number (00h=default,01h=A:,etc)
  7939.     DS:DX -> buffer for ASCIZ pathname
  7940.     SI = file index (0000h to number of open files-1)
  7941.     DI = enumeration type (0000h all files, 0001h unmovable files)
  7942. Return: CF set on error
  7943.         AX = error code (01h,02h,12h,etc.) (see #1020 at AH=59h/BX=0000h)
  7944.         0012h if file index is out of range
  7945.     CF clear if successful
  7946.         AX = file open mode (BX from AX=6C00h or AX=716Ch)
  7947.         CX = file type (see #0919)
  7948. SeeAlso: AX=440Dh"DOS 3.2+",AX=440Dh/CX=084Ah,AX=440Dh/CX=086Ch
  7949. SeeAlso: AX=440Dh/CX=086Eh,AX=6C00h,AX=716Ch
  7950.  
  7951. (Table 0919)
  7952. Values for file type:
  7953.  0000h    normal file
  7954.  0001h    memory-mapped file (unmovable)
  7955.  0002h    unmovable file
  7956.  0004h    swap file
  7957. --------D-21440DCX086E-----------------------
  7958. INT 21 - MS-DOS 7.0 - GENERIC IOCTL - FIND SWAP FILE
  7959.     AX = 440Dh
  7960.     CX = 086Eh (category code 08h, minor code 6Eh)
  7961.     BL = drive number (00h=default,01h=A:,etc)
  7962.     DS:DX -> buffer for ASCIZ pathname
  7963.     SI = file index
  7964.     DI = enumeration type
  7965. Return: CF set on error
  7966.         AX = error code (01h,02h,etc.) (see #1020 at AH=59h/BX=0000h)
  7967.     CF clear if successful
  7968.         AX = pager type
  7969.         0001h no pager
  7970.         0002h paging through MS-DOS
  7971.         0003h protected-mode pager
  7972.         CX:BX = swap file size in 4K pages
  7973. SeeAlso: AX=440Dh"DOS 3.2+",AX=440Dh/CX=086Dh
  7974. --------D-21440DCX0870-----------------------
  7975. INT 21 - MS-DOS 7.0 - GENERIC IOCTL - GET CURRENT LOCK STATE
  7976.     AX = 440Dh
  7977.     CX = 0870h (category code 08h, minor code 70h)
  7978.     BL = drive number (00h=default,01h=A:,etc)
  7979. Return: CF set on error
  7980.         AX = error code (01h,02h,etc.) (see #1020 at AH=59h/BX=0000h)
  7981.     CF clear if successful
  7982.         AX = current lock level (0-3) or FFFFh if not locked
  7983.         CX = lock permissions if AX<>FFFFh (see #0917)
  7984. SeeAlso: AX=440Dh"DOS 3.2+",AX=440Dh/CX=086Ch
  7985. --------D-21440DCX0871-----------------------
  7986. INT 21 - MS-DOS 7.0 - GENERIC IOCTL - GET FIRST CLUSTER
  7987.     AX = 440Dh
  7988.     CX = 0871h (category code 08h, minor code 71h)
  7989.     BX = filename character set (see #0920)
  7990.     DS:DX -> ASCIZ pathname for file or directory
  7991. Return: CF set on error
  7992.         AX = error code (01h,02h,etc.) (see #1020 at AH=59h/BX=0000h)
  7993.     CF clear if successful
  7994.         DX:AX = first cluster number
  7995. Note:    this function finds any file or directory regardless of attributes,
  7996.       except that it will not find volume labels
  7997. SeeAlso: AX=440Dh"DOS 3.2+",AX=440Dh/CX=086Ch,#0700
  7998.  
  7999. (Table 0920)
  8000. Values for character set:
  8001.  00h    Windows ANSI
  8002.  01h    current OEM character set
  8003.  02h    Unicode
  8004. --------D-21440E-----------------------------
  8005. INT 21 - DOS 3.2+ - IOCTL - GET LOGICAL DRIVE MAP
  8006.     AX = 440Eh
  8007.     BL = drive number (00h=default,01h=A:,etc)
  8008. Return: CF set on error
  8009.         AX = error code (01h,0Fh) (see #1020 at AH=59h/BX=0000h)
  8010.     CF clear if successful
  8011.         AL = 00h block device has only one logical drive assigned
  8012.          1..26 the last letter used to reference the drive (1=A:,etc)
  8013. Notes:    DR DOS 3.41-5.0 DRIVER.SYS does not support drive mapping and thus
  8014.       always returns AL=00h
  8015.     in addition to the normal operation, if Stacker is installed, this
  8016.       call also sets the volume number at offset 58h in the Stacker
  8017.       device driver (DR DOS 3.41-5.0 only; use AX=4408h otherwise)
  8018.       (see AX=4404h"Stacker",INT 25/AX=CDCDh)
  8019. SeeAlso: AX=4408h,AX=440Fh,INT 2F/AX=122Bh
  8020. --------D-21440F-----------------------------
  8021. INT 21 - DOS 3.2+ - IOCTL - SET LOGICAL DRIVE MAP
  8022.     AX = 440Fh
  8023.     BL = physical drive number (00h=default,01h=A:,etc))
  8024. Return: CF set on error
  8025.         AX = error code (01h,0Fh) (see #1020 at AH=59h/BX=0000h)
  8026.     CF clear if successful
  8027.         drive now responds to next logical drive number
  8028. Notes:    maps logical drives to physical drives, similar to DOS's treatment of
  8029.       a single physical floppy drive as both A: and B:
  8030.     DR DOS 3.41-5.0 DRIVER.SYS does not support drive mapping and thus
  8031.       always returns an error on this function
  8032. SeeAlso: AX=440Eh,INT 2F/AX=122Bh
  8033. --------D-214410-----------------------------
  8034. INT 21 - DOS 5+ - IOCTL - QUERY GENERIC IOCTL CAPABILITY (HANDLE)
  8035.     AX = 4410h
  8036.     BX = handle for device
  8037.     CH = category code (see #0887)
  8038.     CL = function code (see #0888)
  8039. Return: CF clear if successful
  8040.         AX = 0000h    specified IOCTL function is supported
  8041.     CF set on error
  8042.         AL = 01h    IOCTL capability not available
  8043. Note:    a program which wishes to use Generic IOCTL calls beyond those in the
  8044.       standard DOS 3.2 set may use this call first to see whether a
  8045.       particular call is supported
  8046. SeeAlso: AX=440Ch,AX=440Dh"DOS 3.2+",AX=4411h
  8047. --------d-214410BXFFFF-----------------------
  8048. INT 21 U - NewSpace - ENABLE DRIVER
  8049.     AX = 4410h
  8050.     BX = FFFFh
  8051. Program: NewSpace is a TSR by Isogon Corporation which automatically compresses
  8052.       all files as they are written and decompresses them as they are read
  8053. Note:    compressed files are not accessible unless the driver is enabled
  8054. SeeAlso: AX=4411h/BX=FFFFh
  8055. --------D-214411-----------------------------
  8056. INT 21 - DOS 5+ - IOCTL - QUERY GENERIC IOCTL CAPABILITY (DRIVE)
  8057.     AX = 4411h
  8058.     BL = drive number
  8059.     CH = category code (see #0900)
  8060.     CL = function code (see #0901)
  8061. Return: CF clear if successful
  8062.         AX = 0000h    specified IOCTL function is supported
  8063.     CF set on error
  8064.         AL = 01h    IOCTL capability not available
  8065. Note:    a program which wishes to use Generic IOCTL calls beyond those in the
  8066.       standard DOS 3.2 set may use this call first to see whether a
  8067.       particular call is supported
  8068. SeeAlso: AX=440Ch,AX=440Dh"DOS 3.2+",AX=4410h
  8069. --------d-214411BXFFFF-----------------------
  8070. INT 21 U - NewSpace - DISABLE DRIVER
  8071.     AX = 4411h
  8072.     BX = FFFFh
  8073. Program: NewSpace is a TSR by Isogon Corporation which automatically compresses
  8074.       all files as they are written and decompresses them as they are read
  8075. Note:    compressed files are not accessible unless the driver is enabled
  8076. SeeAlso: AX=4410h/BX=FFFFh
  8077. --------O-214412-----------------------------
  8078. INT 21 O - DR DOS 5.0-6.0 - DETERMINE DOS TYPE
  8079.     AX = 4412h
  8080.     CF set
  8081. Return: CF set if not DR DOS
  8082.         AX = error code (see #1020 at AH=59h/BX=0000h)
  8083.     CF clear if DR DOS
  8084.         DX = AX = version code (see #0922)
  8085. Note:    this obsolete call, which is no longer supported in Novell DOS 7, is
  8086.       identical to AX=4452h
  8087. SeeAlso: AX=4452h
  8088. --------d-214412BXFFFF-----------------------
  8089. INT 21 U - NewSpace - INSTALLATION CHECK???
  8090.     AX = 4412h
  8091.     BX = FFFFh
  8092. Return: AX = PSP segment of NewRes (resident driver for NewSpace)
  8093.     BX:DX -> ???
  8094.     CX = ???
  8095. SeeAlso: AX=4411h/BX=FFFFh
  8096. --------d-214413BXFFFF-----------------------
  8097. INT 21 U - NewSpace - GET ???
  8098.     AX = 4413h
  8099.     BX = FFFFh
  8100. Return: AX = code segment of NewRes (resident driver for NewSpace)
  8101.     BX = offset of ???
  8102. SeeAlso: AX=4412h/BX=FFFFh
  8103. --------O-214414-----------------------------
  8104. INT 21 OU - DR DOS 5.0-6.0 - SET GLOBAL PASSWORD
  8105.     AX = 4414h
  8106.     DS:DX -> password string (blank-padded to 8 characters)
  8107. Desc:    Specify the master password for accessing files.
  8108. Note:    this obsolete call, which is no longer supported in Novell DOS 7, is
  8109.       identical to AX=4454h
  8110. SeeAlso: AX=4454h
  8111. --------d-214414BXFFFF-----------------------
  8112. INT 21 U - NewSpace - DEBUGGING DUMP
  8113.     AX = 4414h
  8114.     BX = FFFFh
  8115. Return: debugging dump written to X:\NEWSPACE.SMP
  8116. SeeAlso: AX=4413h/BX=FFFFh,AX=44FFh/BX=FFFFh
  8117. --------O-2144-------------------------------
  8118. INT 21 OU - DR DOS 5.0-6.0 - HISTORY BUFFER, SHARE, AND HILOAD CONTROL
  8119.     AH = 44h
  8120.     AL = 16h to 18h
  8121. Note:    these obsolete subfunctions (which are no longer supported in Novell
  8122.       DOS 7) are identical to AX=4456h through 4458h
  8123. SeeAlso: AX=4456h,AX=4457h,AX=4458h
  8124. --------O-214451-----------------------------
  8125. INT 21 - Concurrent DOS v3.2+ - INSTALLATION CHECK
  8126.     AX = 4451h
  8127. Return: CF set if not Concurrent DOS
  8128.         AX = error code (see #1020 at AH=59h/BX=0000h)
  8129.     CF clear if successful
  8130.         AH = single-user/multiuser nature
  8131.         10h single-user
  8132.             AL = operating system version ID (see #0922)
  8133.         14h multiuser
  8134.             AL = operating system version ID (see #0921)
  8135. Notes:    as of Concurrent DOS/XM 5.0 (possibly earlier), the version is stored
  8136.       in the environment variable VER
  8137.     use this function if you are looking for multiuser capabilities,
  8138.       AX=4452h for single-user
  8139.     this function should never return the single-user values
  8140. SeeAlso: AX=4452h,AX=4459h
  8141.  
  8142. (Table 0921)
  8143. Values for Digital Research operating system version ID:
  8144.  32h    Concurrent PC DOS 3.2
  8145.  41h    Concurrent DOS 4.1
  8146.  50h    Concurrent DOS/XM 5.0 or Concurrent DOS/386 1.1
  8147.  60h    Concurrent DOS/XM 6.0 or Concurrent DOS/386 2.0
  8148.  62h    Concurrent DOS/XM 6.2 or Concurrent DOS/386 3.0
  8149.  66h    DR Multiuser DOS 5.1
  8150.  67h    Concurrent DOS 5.1
  8151. --------O-214452-----------------------------
  8152. INT 21 - DR DOS 3.41+ - DETERMINE DOS TYPE/GET DR DOS VERSION
  8153.     AX = 4452h ("DR")
  8154.     CF set
  8155. Return: CF set if not DR DOS
  8156.         AX = error code (see #1020 at AH=59h/BX=0000h)
  8157.     CF clear if DR DOS
  8158.         AX = version code
  8159.         AH = single-user/multiuser nature
  8160.         10h single-user
  8161.             AL = operating system version ID (see #0922)
  8162.         14h multiuser
  8163.             AL = operating system version ID (see #0921)
  8164.         DX modified (refer to note below)
  8165. Notes:    the DR DOS version is stored in the environment variable VER
  8166.     use this function if looking for single-user capabilities, AX=4451h
  8167.       if looking for multiuser; this call should never return multiuser
  8168.       values
  8169.     in DR DOS 3.41-6.0, DX=AX on return; for Novell DOS 7, DH=AH but DL=00h
  8170.       (reportedly, DH=00h when booting NWDOS7 from installation disks)
  8171.     Novell DOS 7 returns error code 0001h if SETVER 255.x is in effect for
  8172.       the calling program
  8173. SeeAlso: AX=4412h,AX=4451h,AX=4459h
  8174.  
  8175. (Table 0922)
  8176. Values for Digital Research operating system version ID:
  8177.  60h    DOS Plus
  8178.  63h    DR DOS 3.41
  8179.  64h    DR DOS 3.42
  8180.  65h    DR DOS 5.00
  8181.  67h    DR DOS 6.00
  8182.  70h    PalmDOS
  8183.  71h    DR DOS 6.0 March 1993 "business update"
  8184.  72h    Novell DOS 7.0
  8185. --------O-214454-----------------------------
  8186. INT 21 U - DR DOS 3.41+ - SET GLOBAL PASSWORD
  8187.     AX = 4454h
  8188.     DS:DX -> password string (blank-padded to 8 characters)
  8189. Desc:    Specify the master password for accessing files.
  8190. SeeAlso: AX=4303h,AX=4414h
  8191. --------O-214456-----------------------------
  8192. INT 21 U - DR DOS 5.0+ - HISTORY BUFFER CONTROL
  8193.     AX = 4456h
  8194.     DL = control flags (see #0923)
  8195. Return: AL = previous value of state flags (see #0924)
  8196. Note:    DR DOS 6.0 only checks bit 0 and ignores the rest of DL
  8197. SeeAlso: #0925
  8198.  
  8199. Bitfields for control flags:
  8200. Bit(s)    Description    (Table 0923)
  8201.  0    whose buffer: 0=application, 1=COMMAND.COM
  8202. ---Novell DOS 7---
  8203.  1    toggle HISTORY usage
  8204.  2    toggle INSERT state
  8205. Note:    only one bit at a time may be used
  8206.  
  8207. Bitfields for state flags:
  8208. Bit(s)    Description    (Table 0924)
  8209.  0    HISTORY buffer enabled
  8210.  1    INSERT enabled
  8211.  2-5    unused
  8212.  7    whose buffer: 0=application, 1=COMMAND.COM
  8213. --------O-214457-----------------------------
  8214. INT 21 U - DR DOS 5.0-6.0 - SHARE/HILOAD CONTROL
  8215.     AX = 4457h
  8216.     DH = subfunction
  8217.         00h enable/disable SHARE
  8218.         DL = 00h disable
  8219.            = 01h enable
  8220.            else Return: AX = ???
  8221.         01h get HILOAD status
  8222.         Return: AX = status
  8223.                 0000h off
  8224.                 0001h on
  8225.         02h set HILOAD status
  8226.         DL = new state (00h off, 01h on)
  8227.         Return: AX = ???
  8228.         other
  8229.         Return: AX = ???
  8230. Note:    This was seen called by COMMAND.COM of DR DOS 6.0; it does not seem
  8231.       to be supported by Novell DOS 7
  8232. SeeAlso: AX=4457h/DX=FFFFh
  8233. --------O-214457DXFFFF-----------------------
  8234. INT 21 U - DR DOS 6.0 - GET SHARE STATUS
  8235.     AX = 4457h
  8236.     DX = FFFFh
  8237. Return: AX = SHARE status
  8238. SeeAlso: INT 2F/AX=1000h
  8239. --------O-214458-----------------------------
  8240. INT 21 U - DR DOS 5.0+ internal - GET POINTER TO INTERNAL VARIABLE TABLE
  8241.     AX = 4458h
  8242. Return: ES:BX -> internal variable table (see #0925,#0926)
  8243.     AX = ??? (0B50h for DR DOS 5.0, 0A56h for DR DOS 6.0, 0FE4h for
  8244.           Novell DOS 7)
  8245. SeeAlso: AX=4452h
  8246.  
  8247. Format of DR DOS 5.0-6.0 internal variable table:
  8248. Offset    Size    Description    (Table 0925)
  8249.  00h    WORD    ???
  8250.  02h    WORD    segment of ???
  8251.  04h    WORD    offset within DOS data segment of history control structure
  8252.           for COMMAND.COM history buffer (see #0927)
  8253.  06h    WORD    offset within DOS data segment of history control structure
  8254.           for application history buffer (see #0927)
  8255.  08h    BYTE    initial history state flags (see #0924)
  8256.  09h  2 BYTEs    ???
  8257.  0Bh    WORD    KB of extended memory at startup
  8258.  0Dh    BYTE    number of far jump entry points
  8259.  0Eh    WORD    segment containing far jumps to DR DOS entry points (see #0928)
  8260.  10h    WORD    (only if kernel loaded in HMA) offset in HMA of first free HMA
  8261.           memory block (see #0929) or 0000h if none; segment is FFFFh
  8262.  12h    WORD    pointer to segment of environment variables set in CONFIG,
  8263.           or 0000h if already used
  8264. ---DR DOS 6.0---
  8265.  14h    WORD    (only if kernel loaded in HMA) offset in HMA of first used HMA
  8266.         memory block (see #0929) or 0000h if none; segment is FFFFh
  8267.  16h  8 BYTEs    ???
  8268.  1Eh    WORD    offset in DOS data segment of full COUNTRY.SYS filename
  8269.  20h  8 BYTEs    ???
  8270.  28h    WORD    offset in DOS data segment of SHARE hook table
  8271.  2Ah  2 BYTEs    ???
  8272.  2Ch    WORD    offset in DOS data segment of far pointer to INT 2F/AX=1000h
  8273.           handler
  8274. Note:    the segment used for the DR DOS 6.0 CONFIG environment variables
  8275.       (excluding COMSPEC, VER and OS) is only useful for programs/drivers
  8276.       called from CONFIG.SYS. The word is set to zero later when the area
  8277.       is copied to the COMMAND.COM environment space.  This allows
  8278.       CONFIG.SYS to pass information to AUTOEXEC.BAT.
  8279.  
  8280. Format of Novell DOS 7 internal variable table:
  8281. Offset    Size    Description    (Table 0926)
  8282.  00h    ???
  8283.  1Eh    WORD    offset of COUNTRY.SYS filename
  8284.  42h 16 DWORDs    pointers to ??? entry points
  8285.     ???
  8286.  
  8287. Format of history control structure:
  8288. Offset    Size    Description    (Table 0927)
  8289.  00h    WORD    segment of buffer
  8290.  02h    WORD    size of buffer in bytes
  8291.  04h    WORD    ???
  8292.  
  8293. Format of kernel entry jump table for DR DOS 5.0-6.0:
  8294. Offset    Size    Description    (Table 0928)
  8295.  00h  5 BYTEs    far jump to kernel entry point for CP/M CALL 5
  8296.  05h  5 BYTEs    far jump to kernel entry point for INT 20
  8297.  0Ah  5 BYTEs    far jump to kernel entry point for INT 21
  8298.  0Fh  5 BYTEs    far jump to kernel entry point for INT 22 (RETF)
  8299.  14h  5 BYTEs    far jump to kernel entry point for INT 23 (RETF)
  8300.  19h  5 BYTEs    far jump to kernel entry point for INT 24
  8301.  1Eh  5 BYTEs    far jump to kernel entry point for INT 25
  8302.  23h  5 BYTEs    far jump to kernel entry point for INT 26
  8303.  28h  5 BYTEs    far jump to kernel entry point for INT 27
  8304.  2Dh  5 BYTEs    far jump to kernel entry point for INT 28
  8305.  32h  5 BYTEs    far jump to kernel entry point for INT 2A (IRET)
  8306.  37h  5 BYTEs    far jump to kernel entry point for INT 2B (IRET)
  8307.  3Ch  5 BYTEs    far jump to kernel entry point for INT 2C (IRET)
  8308.  41h  5 BYTEs    far jump to kernel entry point for INT 2D (IRET)
  8309.  46h  5 BYTEs    far jump to kernel entry point for INT 2E (IRET)
  8310.  4Bh  5 BYTEs    far jump to kernel entry point for INT 2F
  8311. Notes:    all of these entry points are indirected through this jump table
  8312.       to allow the kernel to be relocated into high memory while leaving
  8313.       the actual entry addresses in low memory for maximum compatibility
  8314.     some of these entry points (22h,23h,24h,2Eh,2Fh) are replaced as soon
  8315.       as COMMAND.COM is loaded, and return immediately to the caller, some
  8316.       returning an error code (the original handler for INT 2F returns
  8317.       AL=03h [fail]).
  8318.  
  8319. Format of HMA Memory Block (DR DOS 6.0 kernel loaded in HMA):
  8320. Offset    Size    Description    (Table 0929)
  8321.  00h    WORD    offset of next HMA Memory Block (0000h if last block)
  8322.  02h    WORD    size of this block in bytes (at least 10h)
  8323.  04h    BYTE    type of HMA Memory Block (interpreted by MEM)
  8324.         00h system
  8325.         01h KEYB
  8326.         02h NLSFUNC
  8327.         03h SHARE
  8328.         04h TaskMAX
  8329.         05h COMMAND
  8330.  05h    var    TSR (or system) code and data. DR DOS TSR's, such as KEYB,
  8331.           hooks interrupts using segment FFFEh instead FFFFh.
  8332. --------O-214459-----------------------------
  8333. INT 21 - DR MultiUser DOS 5.0 - API
  8334.     AX = 4459h
  8335.     CL = function (see #3268 at INT E0"CP/M-86")
  8336.     DS,DX = parameters
  8337. Notes:    DR DOS 5.0 and Novell DOS 7 return CF set and AX=0001h
  8338.     this API is also available on INT E0
  8339. SeeAlso: AX=4452h,INT E0"CP/M-86"
  8340. --------v-2144A0-----------------------------
  8341. INT 21 - VIRUS - "Horns" - INSTALLATION CHECK
  8342.     AX = 44A0h
  8343. Return: AH = FFh if installed
  8344. SeeAlso: AX=4243h"VIRUS",AX=4B04h"VIRUS"
  8345. --------N-2144E0-----------------------------
  8346. INT 21 U - Sun PC-NFS - API???
  8347.     AX = 44E0h
  8348.     DS:DX -> ???
  8349.     SS:BP -> stack frame (see #0930)
  8350. Return: ???
  8351. Note:    this function is also supported by Beame&Whiteside's BWPCNFS shim; the
  8352.       description presented here was derived from that shim
  8353.  
  8354. Format of PC-NFS stack frame:
  8355. Offset    Size    Description    (Table 0930)
  8356.  00h    WORD    -> previous stack frame
  8357.  02h    DWORD    return address
  8358. --------d-2144FFBXFFFF-----------------------
  8359. INT 21 U - NewSpace - ???
  8360.     AX = 44FFh
  8361.     BX = FFFFh
  8362.     DX = ???
  8363. Program: NewSpace is a TSR by Isogon Corporation which automatically compresses
  8364.       all files as they are written and decompresses them as they are read
  8365. SeeAlso: AX=4414h/BX=FFFFh
  8366. --------D-2145-------------------------------
  8367. INT 21 - DOS 2+ - "DUP" - DUPLICATE FILE HANDLE
  8368.     AH = 45h
  8369.     BX = file handle
  8370. Return: CF clear if successful
  8371.         AX = new handle
  8372.     CF set on error
  8373.         AX = error code (04h,06h) (see #1020 at AH=59h/BX=0000h)
  8374. Notes:    moving file pointer for either handle will also move it for the other,
  8375.       because both will refer to the same system file table
  8376.     for DOS versions prior to 3.3, file writes may be forced to disk by
  8377.       duplicating the file handle and closing the duplicate
  8378. SeeAlso: AH=3Dh,AH=46h
  8379. --------D-2146-------------------------------
  8380. INT 21 - DOS 2+ - "DUP2", "FORCEDUP" - FORCE DUPLICATE FILE HANDLE
  8381.     AH = 46h
  8382.     BX = file handle
  8383.     CX = file handle to become duplicate of first handle
  8384. Return: CF clear if successful
  8385.     CF set on error
  8386.         AX = error code (04h,06h) (see #1020 at AH=59h/BX=0000h)
  8387. Notes:    closes file with handle CX if it is still open
  8388.     DOS 3.30 hangs if BX=CX on entry
  8389.     moving file pointer for either handle will also move it for the other,
  8390.       because both will refer to the same system file table
  8391. SeeAlso: AH=3Dh,AH=45h
  8392. --------D-2147-------------------------------
  8393. INT 21 - DOS 2+ - "CWD" - GET CURRENT DIRECTORY
  8394.     AH = 47h
  8395.     DL = drive number (00h = default, 01h = A:, etc)
  8396.     DS:SI -> 64-byte buffer for ASCIZ pathname
  8397. Return: CF clear if successful
  8398.         AX = 0100h (undocumented)
  8399.     CF set on error
  8400.         AX = error code (0Fh) (see #1020 at AH=59h/BX=0000h)
  8401. Notes:    the returned path does not include a drive or the initial backslash
  8402.     many Microsoft products for Windows rely on AX being 0100h on success
  8403.     under the FlashTek X-32 DOS extender, the buffer pointer is in DS:ESI
  8404. SeeAlso: AH=19h,AH=3Bh,AH=71h,INT 15/AX=DE25h
  8405. --------D-2148-------------------------------
  8406. INT 21 - DOS 2+ - ALLOCATE MEMORY
  8407.     AH = 48h
  8408.     BX = number of paragraphs to allocate
  8409. Return: CF clear if successful
  8410.         AX = segment of allocated block
  8411.     CF set on error
  8412.         AX = error code (07h,08h) (see #1020 at AH=59h/BX=0000h)
  8413.         BX = size of largest available block
  8414. Notes:    DOS 2.1-6.0 coalesces free blocks while scanning for a block to
  8415.       allocate
  8416.     .COM programs are initially allocated the largest available memory
  8417.       block, and should free some memory with AH=49h before attempting any
  8418.       allocations
  8419.     under the FlashTek X-32 DOS extender, EBX contains a protected-mode
  8420.       near pointer to the allocated block on a successful return
  8421. SeeAlso: AH=49h,AH=4Ah,AH=58h,AH=83h
  8422. --------D-2149-------------------------------
  8423. INT 21 - DOS 2+ - FREE MEMORY
  8424.     AH = 49h
  8425.     ES = segment of block to free
  8426. Return: CF clear if successful
  8427.     CF set on error
  8428.         AX = error code (07h,09h) (see #1020 at AH=59h/BX=0000h)
  8429. Notes:    apparently never returns an error 07h, despite official docs; DOS 2.1+
  8430.       code contains only an error 09h exit
  8431.     DOS 2.1-6.0 does not coalesce adjacent free blocks when a block is
  8432.       freed, only when a block is allocated or resized
  8433.     the code for this function is identical in DOS 2.1-6.0 except for
  8434.       calls to start/end a critical section in DOS 3.0+
  8435. SeeAlso: AH=48h,AH=4Ah
  8436. --------D-214A-------------------------------
  8437. INT 21 - DOS 2+ - RESIZE MEMORY BLOCK
  8438.     AH = 4Ah
  8439.     BX = new size in paragraphs
  8440.     ES = segment of block to resize
  8441. Return: CF clear if successful
  8442.     CF set on error
  8443.         AX = error code (07h,08h,09h) (see #1020 at AH=59h/BX=0000h)
  8444.         BX = maximum paragraphs available for specified memory block
  8445. Notes:    under DOS 2.1-6.0, if there is insufficient memory to expand the block
  8446.       as much as requested, the block will be made as large as possible
  8447.     DOS 2.1-6.0 coalesces any free blocks immediately following the block
  8448.       to be resized
  8449. SeeAlso: AH=48h,AH=49h,AH=83h
  8450. --------v-214A--BX00B6-----------------------
  8451. INT 21 - VIRUS???
  8452.     AH = 4Ah
  8453.     BX = 00B6h
  8454.     ES = CX
  8455. Return: ???
  8456. Note:    this call is intercepted by the Search&Destroy SDRes v27.03 bundled
  8457.       with Novell DOS 7, and is presumably some virus's installation check
  8458. SeeAlso: AH=0Eh/DL=ADh,AH=4Ah/BX=FFFFh,AH=D2h"VIRUS"
  8459. --------v-214A--BXFFFF-----------------------
  8460. INT 21 - VIRUS???
  8461.     AH = 4Ah
  8462.     BX = FFFFh
  8463.     CX = 0568h
  8464.     SI = 0129h
  8465.     DI = 0000h
  8466.     ES = BP
  8467. Return: ???
  8468. Note:    this call is intercepted by the Search&Destroy SDRes v27.03 bundled
  8469.       with Novell DOS 7, and is presumably some virus's installation check
  8470. SeeAlso: AH=0Eh/DL=ADh,AH=4Ah/BX=00B6h
  8471. --------D-214B-------------------------------
  8472. INT 21 - DOS 2+ - "EXEC" - LOAD AND/OR EXECUTE PROGRAM
  8473.     AH = 4Bh
  8474.     AL = type of load
  8475.         00h load and execute
  8476.         01h load but do not execute
  8477.         03h load overlay (see #0932)
  8478.         04h load and execute in background (European MS-DOS 4.0 only)
  8479.         "Exec & Go" (see also AH=80h)
  8480.     DS:DX -> ASCIZ program name (must include extension)
  8481.     ES:BX -> parameter block (see #0931,#0932,#0933)
  8482.     CX = mode (subfunction 04h only)
  8483.         0000h child placed in zombie mode after termination
  8484.         0001h child's return code discarded on termination
  8485. Return: CF clear if successful
  8486.         BX,DX destroyed
  8487.         if subfunction 01h, process ID set to new program's PSP; get with
  8488.         INT 21/AH=62h
  8489.     CF set on error
  8490.         AX = error code (01h,02h,05h,08h,0Ah,0Bh) (see #1020 at AH=59h)
  8491. Notes:    DOS 2.x destroys all registers, including SS:SP
  8492.     under ROM-based DOS, if no disk path characters (colons or slashes)
  8493.       are included in the program name, the name is searched for in the
  8494.       ROM module headers (see #0936) before searching on disk
  8495.     for functions 00h and 01h, the calling process must ensure that there
  8496.       is enough unallocated memory available; if necessary, by releasing
  8497.       memory with AH=49h or AH=4Ah
  8498.     for function 01h, the AX value to be passed to the child program is put
  8499.       on top of the child's stack
  8500.     for function 03h, DOS assumes that the overlay is being loaded into
  8501.       memory allocated by the caller
  8502.     function 01h was undocumented prior to the release of DOS 5.0
  8503.     some versions (such as DR DOS 6.0) check the parameters and parameter
  8504.       block and return an error if an invalid value (such as an offset of
  8505.       FFFFh) is found
  8506.     background programs under European MS-DOS 4.0 must use the new
  8507.       executable format
  8508.     this function ignores the filename extension, instead checking the
  8509.       first two bytes of the file to determine whether there is a valid
  8510.       .EXE header (see #0935); if not, the file is assumed to be in .COM
  8511.       format.  If present, the file may be in any of several formats which
  8512.       are extensions of the original .EXE format (see #0934)
  8513.     .COM-format executables begin running with the following register
  8514.       values:
  8515.         AL = 00h if first FCB has valid drive letter, FFh if not
  8516.         AH = 00h if second FCB has valid drive letter, FFh if not
  8517.         CS,DS,ES,SS = PSP segment
  8518.         SP = offset of last word available in first 64K segment
  8519.         (note: AX is always 0000h under DESQview)
  8520.     old-format executables begin running with the following register
  8521.       values:
  8522.         AL = 00h if first FCB has valid drive letter, FFh if not
  8523.         AH = 00h if second FCB has valid drive letter, FFh if not
  8524.         DS,ES = PSP segment
  8525.         SS:SP as defined in .EXE header
  8526.         (note: AX is always 0000h under DESQview)
  8527.     new executables begin running with the following register values
  8528.         AX = environment segment
  8529.         BX = offset of command tail in environment segment
  8530.         CX = size of automatic data segment (0000h = 64K)
  8531.         ES,BP = 0000h
  8532.         DS = automatic data segment
  8533.         SS:SP = initial stack
  8534.       the command tail corresponds to an old executable's PSP:0081h and
  8535.       following, except that the 0Dh is turned into a NUL (00h); new
  8536.       format executables have no PSP
  8537.     under the FlashTek X-32 DOS extender, only function 00h is supported
  8538.       and the pointers are passed in DS:EDX and ES:EBX
  8539.     DR DOS 6 always loads .EXE-format programs with no fixups and
  8540.       .COM-format programs starting with 9Ch 55h (PUSHF/PUSH BP) above the
  8541.       64K mark to avoid the EXEPACK bug, by extending the memory block
  8542.       containing the program's environment; this code is disabled if the
  8543.       name of the parent program as stored in the MCB is 'WIN'.
  8544. BUGS:    DOS 2.00 assumes that DS points at the current program's PSP
  8545.     Load Overlay (subfunction 03h) loads up to 512 bytes too many if the
  8546.       file contains additional data after the actual overlay
  8547. SeeAlso: AX=4B05h,AH=4Ch,AH=4Dh,AH=64h/BX=0025h,AH=8Ah,INT 2E,INT 60/DI=0604h
  8548.  
  8549. Format of EXEC parameter block for AL=00h,01h,04h:
  8550. Offset    Size    Description    (Table 0931)
  8551.  00h    WORD    segment of environment to copy for child process (copy caller's
  8552.           environment if 0000h)
  8553.  02h    DWORD    pointer to command tail to be copied into child's PSP
  8554.  06h    DWORD    pointer to first FCB to be copied into child's PSP
  8555.  0Ah    DWORD    pointer to second FCB to be copied into child's PSP
  8556.  0Eh    DWORD    (AL=01h) will hold subprogram's initial SS:SP on return
  8557.  12h    DWORD    (AL=01h) will hold entry point (CS:IP) on return
  8558. SeeAlso: #0932,#0933
  8559.  
  8560. Format of EXEC parameter block for AL=03h:
  8561. Offset    Size    Description    (Table 0932)
  8562.  00h    WORD    segment at which to load overlay
  8563.  02h    WORD    relocation factor to apply to overlay if in .EXE format
  8564. SeeAlso: #0931,#0933
  8565.  
  8566. Format of EXEC parameter block for FlashTek X-32:
  8567. Offset    Size    Description    (Table 0933)
  8568.  00h    PWORD    48-bit far pointer to environment string
  8569.  06h    PWORD    48-bit far pointer to command tail string
  8570. SeeAlso: #0931,#0932
  8571.  
  8572. (Table 0934)
  8573. Values for the executable types understood by various environments:
  8574.  MZ    old-style DOS executable (see #0935)
  8575.  NE    Windows or OS/2 1.x segmented ("new") executable (see #0937)
  8576.  LE    Windows virtual device driver (VxD) linear executable (see #0950)
  8577.  LX    variant of LE used in OS/2 2.x (see #0950)
  8578.  W3    Windows WIN386.EXE file; a collection of LE files
  8579.  W4    Windows95 VMM32.VXD file
  8580.  PE    Win32 (Windows NT and Win32s) portable executable based on Unix COFF
  8581.  DL    HP 100LX/200LX system manager compliant executable (.EXM)
  8582.  MP    old PharLap .EXP (see #0960)
  8583.  P2    PharLap 286 .EXP (see #0961)
  8584.  P3    PharLap 386 .EXP (see #0961)
  8585.  
  8586. Format of .EXE file header:
  8587. Offset    Size    Description    (Table 0935)
  8588.  00h  2 BYTEs    .EXE signature, either "MZ" or "ZM" (5A4Dh or 4D5Ah)
  8589.           (see also #0934)
  8590.  02h    WORD    number of bytes in last 512-byte page of executable
  8591.  04h    WORD    total number of 512-byte pages in executable (includes any
  8592.         partial last page)
  8593.  06h    WORD    number of relocation entries
  8594.  08h    WORD    header size in paragraphs
  8595.  0Ah    WORD    minimum paragraphs of memory required to allocate in addition
  8596.           to executable's size
  8597.  0Ch    WORD    maximum paragraphs to allocate in addition to executable's size
  8598.  0Eh    WORD    initial SS relative to start of executable
  8599.  10h    WORD    initial SP
  8600.  12h    WORD    checksum (one's complement of sum of all words in executable)
  8601.  14h    DWORD    initial CS:IP relative to start of executable
  8602.  18h    WORD    offset within header of relocation table
  8603.         40h or greater for new-format (NE,LE,LX,W3,PE,etc.) executable
  8604.  1Ah    WORD    overlay number (normally 0000h = main program)
  8605. ---new executable---
  8606.  1Ch  4 BYTEs    ???
  8607.  20h    WORD    behavior bits
  8608.  22h 26 BYTEs    reserved for additional behavior info
  8609.  3Ch    DWORD    offset of new executable (NE,LE,etc) header within disk file,
  8610.         or 00000000h if plain MZ executable
  8611. ---Borland TLINK---
  8612.  1Ch  2 BYTEs    ??? (apparently always 01h 00h)
  8613.  1Eh    BYTE    signature FBh
  8614.  1Fh    BYTE    TLINK version (major in high nybble, minor in low nybble)
  8615.  20h  2 BYTEs    ??? (v2.0 apparently always 72h 6Ah, v3.0+ seems always 6Ah 72h)
  8616. ---ARJ self-extracting archive---
  8617.  1Ch  4 BYTEs    signature "RJSX" (older versions, new signature is "aRJsfX" in
  8618.         the first 1000 bytes of the file)
  8619. ---LZEXE 0.90 compressed executable---
  8620.  1Ch  4 BYTEs    signature "LZ09"
  8621. ---LZEXE 0.91 compressed executable---
  8622.  1Ch  4 BYTEs    signature "LZ91"
  8623. ---PKLITE compressed executable---
  8624.  1Ch    BYTE    minor version number
  8625.  1Dh    BYTE    bits 0-3: major version
  8626.         bit 4: extra compression
  8627.         bit 5: huge (multi-segment) file
  8628.  1Eh  6 BYTEs    signature "PKLITE" (followed by copyright message)
  8629. ---LHarc 1.x self-extracting archive---
  8630.  1Ch  4 BYTEs    unused???
  8631.  20h  3 BYTEs    jump to start of extraction code
  8632.  23h  2 BYTEs    ???
  8633.  25h 12 BYTEs    signature "LHarc's SFX "
  8634. ---LHA 2.x self-extracting archive---
  8635.  1Ch  8 BYTEs    ???
  8636.  24h 10 BYTEs    signature "LHa's SFX " (v2.10) or "LHA's SFX " (v2.13)
  8637. ---TopSpeed C 3.0 CRUNCH compressed file---
  8638.  1Ch    DWORD    018A0001h
  8639.  20h    WORD    1565h
  8640. ---PKARCK 3.5 self-extracting archive---
  8641.  1Ch    DWORD    00020001h
  8642.  20h    WORD    0700h
  8643. ---BSA (Soviet archiver) self-extracting archive---
  8644.  1Ch    WORD    000Fh
  8645.  1Eh    BYTE    A7h
  8646. ---LARC self-extracting archive---
  8647.  1Ch  4 BYTEs    ???
  8648.  20h 11 BYTEs    "SFX by LARC "
  8649. ---LH self-extracting archive---
  8650.  1Ch  8 BYTEs    ???
  8651.  24h  8 BYTEs    "LH's SFX "
  8652. ---RAR self-extracting archive---
  8653.  1Ch  4 BYTEs    signature "RSFX"
  8654. ---other linkers---
  8655.  1Ch    var    optional information
  8656. ---
  8657.   N   N DWORDs    relocation items
  8658. Notes:    if word at offset 02h is 4, it should be treated as 00h, since pre-1.10
  8659.       versions of the MS linker set it that way
  8660.     if both minimum and maximum allocation (offset 0Ah/0Ch) are zero, the
  8661.       program is loaded as high in memory as possible (DOS only checks
  8662.       the maximum allocation, however)
  8663.     the maximum allocation is set to FFFFh by default
  8664.     additional data may be contained in the file beyond the end of the
  8665.       load image described by the .EXE header; this data may be overlays,
  8666.       the actual executable for newer-format executables, or debugging
  8667.       information (see #0941,#0965)
  8668. SeeAlso: #0937
  8669.  
  8670. Format of ROM Module Header:
  8671. Offset    Size    Description    (Table 0936)
  8672.  00h  2 BYTEs    ROM signature 55h, AAh
  8673.  02h    BYTE    size of ROM in 512-byte blocks
  8674.  03h  3 BYTEs    POST initialization entry point (near JMP instruction)
  8675.  06h    ROM Program Name List [array]
  8676.     Offset    Size    Description
  8677.      00h    BYTE    length of ROM program's name (00h if end of name list)
  8678.      01h  N BYTEs    program name
  8679.      N+1  3 BYTEs    program entry point (near JMP instruction)
  8680.  
  8681. Format of new executable header:
  8682. Offset    Size    Description    (Table 0937)
  8683.  00h  2 BYTEs    "NE" (4Eh 45h) signature
  8684.  02h  2 BYTEs    linker version (major, then minor)
  8685.  04h    WORD    offset from start of this header to entry table (see #0944)
  8686.  06h    WORD    length of entry table in bytes
  8687.  08h    DWORD    file load CRC (0 in Borland's TPW)
  8688.  0Ch    BYTE    program flags (see #0938)
  8689.  0Dh    BYTE    application flags (see #0939)
  8690.  0Eh    WORD    auto data segment index
  8691.  10h    WORD    initial local heap size
  8692.  12h    WORD    initial stack size (added to data seg, 0000h if SS <> DS)
  8693.  14h    DWORD    program entry point (CS:IP), "CS" is index into segment table
  8694.  18h    DWORD    initial stack pointer (SS:SP), "SS" is segment index
  8695.         if SS=automatic data segment and SP=0000h, the stack pointer is
  8696.           set to the top of the automatic data segment, just below the
  8697.           local heap
  8698.  1Ch    WORD    segment count
  8699.  1Eh    WORD    module reference count
  8700.  20h    WORD    length of nonresident names table in bytes
  8701.  22h    WORD    offset from start of this header to segment table (see #0942)
  8702.  24h    WORD    offset from start of this header to resource table
  8703.  26h    WORD    offset from start of this header to resident names table
  8704.  28h    WORD    offset from start of this header to module reference table
  8705.  2Ah    WORD    offset from start of this header to imported names table
  8706.         (array of counted strings, terminated with a string of length
  8707.           00h)
  8708.  2Ch    DWORD    offset from start of file to nonresident names table
  8709.  30h    WORD    count of moveable entry point listed in entry table
  8710.  32h    WORD    file alignment size shift count
  8711.         0 is equivalent to 9 (default 512-byte pages)
  8712.  34h    WORD    number of resource table entries
  8713.  36h    BYTE    target operating system
  8714.         00h unknown
  8715.         01h OS/2
  8716.         02h Windows
  8717.         03h European MS-DOS 4.x
  8718.         04h Windows 386
  8719.         05h BOSS (Borland Operating System Services)
  8720.         81h PharLap 286|DOS-Extender, OS/2
  8721.         82h PharLap 286|DOS-Extender, Windows
  8722.  37h    BYTE    other EXE flags (see #0940)
  8723.  38h    WORD    offset to return thunks or start of gangload area
  8724.  3Ah    WORD    offset to segment reference thunks or length of gangload area
  8725.  3Ch    WORD    minimum code swap area size
  8726.  3Eh  2 BYTEs    expected Windows version (minor version first)
  8727. Note:    this header is documented in detail in the Windows 3.1 SDK Programmer's
  8728.       Reference, Vol 4.
  8729. SeeAlso: #0935
  8730.  
  8731. Bitfields for new executable program flags:
  8732. Bit(s)    Description    (Table 0938)
  8733.  0-1    DGROUP type
  8734.       0 = none
  8735.       1 = single shared
  8736.       2 = multiple (unshared)
  8737.       3 = (null)
  8738.  2    global initialization
  8739.  3    protected mode only
  8740.  4    8086 instructions
  8741.  5    80286 instructions
  8742.  6    80386 instructions
  8743.  7    80x87 instructions
  8744.  
  8745. Bitfields for new executable application flags:
  8746. Bit(s)    Description    (Table 0939)
  8747.  0-2    application type
  8748.     001 full screen (not aware of Windows/P.M. API)
  8749.     010 compatible with Windows/P.M. API
  8750.     011 uses Windows/P.M. API
  8751.  3    is a Family Application (OS/2)
  8752.  5    0=executable, 1=errors in image
  8753.  6    non-conforming program (valid stack is not maintained)
  8754.  7    DLL or driver rather than application
  8755.     (SS:SP info invalid, CS:IP points at FAR init routine called with
  8756.       AX=module handle which returns AX=0000h on failure, AX nonzero on
  8757.       successful initialization)
  8758.  
  8759. Bitfields for other new .EXE flags:
  8760. Bit(s)    Description    (Table 0940)
  8761.  0    supports long filenames
  8762.  1    2.X protected mode
  8763.  2    2.X proportional font
  8764.  3    gangload area
  8765.  
  8766. Format of Codeview trailer (at end of executable):
  8767. Offset    Size    Description    (Table 0941)
  8768.  00h    WORD    signature 4E42h ('NB')
  8769.  02h    WORD    Microsoft debug info version number
  8770.  04h    DWORD    Codeview header offset
  8771. SeeAlso: #0965
  8772.  
  8773. Format of new executable segment table record:
  8774. Offset    Size    Description    (Table 0942)
  8775.  00h    WORD    offset in file (shift left by alignment shift to get byte offs)
  8776.  02h    WORD    length of image in file (0000h = 64K)
  8777.  04h    WORD    segment attributes (see #0943)
  8778.  06h    WORD    number of bytes to allocate for segment (0000h = 64K)
  8779. Note:    the first segment table entry is entry number 1
  8780. SeeAlso: #0945
  8781.  
  8782. Bitfields for segment attributes:
  8783. Bit(s)    Description    (Table 0943)
  8784.  0    data segment rather than code segment
  8785.  1    unused???
  8786.  2    real mode
  8787.  3    iterated
  8788.  4    movable
  8789.  5    sharable
  8790.  6    preloaded rather than demand-loaded
  8791.  7    execute-only (code) or read-only (data)
  8792.  8    relocations (directly following code for this segment)
  8793.  9    debug info present
  8794.  10,11    80286 DPL bits
  8795.  12    discardable
  8796.  13-15    discard priority
  8797.  
  8798. Format of new executable entry table item (list):
  8799. Offset    Size    Description    (Table 0944)
  8800.  00h    BYTE    number of entry points (00h if end of entry table list)
  8801.  01h    BYTE    segment number (00h if end of entry table list)
  8802.  02h 3N BYTEs    entry records
  8803.         Offset    Size    Description
  8804.          00h    BYTE    flags
  8805.                 bit 0: exported
  8806.                 bit 1: single data
  8807.                 bits 2-7: unused???
  8808.          01h    WORD    offset within segment
  8809.  
  8810. Format of new executable relocation data (immediately follows segment image):
  8811. Offset    Size    Description    (Table 0945)
  8812.  00h    WORD    number of relocation items
  8813.  02h 8N BYTEs    relocation items
  8814.         Offset    Size    Description
  8815.          00h    BYTE    relocation type
  8816.                 00h LOBYTE
  8817.                 02h BASE
  8818.                 03h PTR
  8819.                 05h OFFS
  8820.                 0Bh PTR48
  8821.                 0Dh OFFS32
  8822.          01h    BYTE    flags
  8823.                 bit 2: additive
  8824.          02h    WORD    offset within segment
  8825.          04h    WORD    target address segment
  8826.          06h    WORD    target address offset
  8827. SeeAlso: #0942,#0946
  8828.  
  8829. Format of new executable resource data:
  8830. Offset    Size    Description    (Table 0946)
  8831.  00h    WORD    alignment shift count for resource data
  8832.  02h  N RECORDs resources
  8833.     Format of resource record:
  8834.     Offset    Size    Description
  8835.      00h    WORD    type ID
  8836.             0000h if end of resource records
  8837.             >= 8000h if integer type
  8838.             else offset from start of resource table to type string
  8839.      02h    WORD    number of resources of this type
  8840.      04h    DWORD    reserved for runtime use
  8841.      08h  N Resources (see #0947)
  8842. Note:    resource type and name strings are stored immediately following the
  8843.       resource table, and are not null-terminated
  8844. SeeAlso: #0947
  8845.  
  8846. Format of new executable resource entry:
  8847. Offset    Size    Description    (Table 0947)
  8848.  00h    WORD    offset in alignment units from start of file to contents of
  8849.         the resource data
  8850.  02h    WORD    length of resource image in bytes
  8851.  04h    WORD    flags
  8852.         bit 4: moveable
  8853.         bit 5: shareable
  8854.         bit 6: preloaded
  8855.  06h    WORD    resource ID
  8856.         >= 8000h if integer resource
  8857.         else offset from start of resource table to resource string
  8858.  08h    DWORD    reserved for runtime use
  8859. Notes:    resource type and name strings are stored immediately following the
  8860.       resource table, and are not null-terminated
  8861.     strings are counted strings, with a string of length 0 indicating the
  8862.       end of the resource table
  8863. SeeAlso: #0946,#0948
  8864.  
  8865. Format of new executable module reference table [one bundle of entries]:
  8866. Offset    Size    Description    (Table 0948)
  8867.  00h    BYTE    number of records in this bundle (00h if end of table)
  8868.  01h    BYTE    segment indicator
  8869.         00h unused
  8870.         FFh movable segment, segment number is in entry
  8871.         else segment number of fixed segment
  8872.  02h  N RECORDs
  8873.     Format of segment record
  8874.     Offset    Size    Description
  8875.      00h    BYTE    flags
  8876.             bit 0: entry is exported
  8877.             bit 1: entry uses global (shared) data
  8878.             bits 7-3: number of parameter words
  8879.     ---fixed segment---
  8880.      01h    WORD    offset
  8881.     ---moveable segment---
  8882.      01h  2 BYTEs    INT 3F instruction (CDh 3Fh)
  8883.      03h    BYTE    segment number
  8884.      05h    WORD    offset
  8885. Note:    table entries are numbered starting from 1
  8886. SeeAlso: #0949
  8887.  
  8888. Format of new executable resident/nonresident name table entry:
  8889. Offset    Size    Description    (Table 0949)
  8890.  00h    BYTE    length of string (00h if end of table)
  8891.  01h  N BYTEs    ASCII text of string
  8892.  N+1    WORD    ordinal number (index into entry table)
  8893. Notes:    the first string in the resident name table is the module name; the
  8894.       first entry in the nonresident name table is the module description
  8895.     the strings are case-sensitive; if the executable was linked with
  8896.       /IGNORECASE, all strings are in uppercase
  8897. SeeAlso: #0948
  8898.  
  8899. Format of Linear Executable (enhanced mode executable) header:
  8900. Offset    Size    Description    (Table 0950)
  8901.  00h  2 BYTEs    "LE" (4Ch 45h) signature (Windows)
  8902.         "LX" (4Ch 58h) signature (OS/2)
  8903.  02h    BYTE    byte order (00h = little-endian, nonzero = big-endian)
  8904.  03h    BYTE    word order (00h = little-endian, nonzero = big-endian)
  8905.  04h    DWORD    executable format level
  8906.  08h    WORD    CPU type (see also INT 15/AH=C9h)
  8907.         01h Intel 80286 or upwardly compatible
  8908.         02h Intel 80386 or upwardly compatible
  8909.         03h Intel 80486 or upwardly compatible
  8910.         04h Intel Pentium (80586) or upwardly compatible
  8911.         20h Intel i860 (N10) or compatible
  8912.         21h Intel "N11" or compatible
  8913.         40h MIPS Mark I (R2000, R3000) or compatible
  8914.         41h MIPS Mark II (R6000) or compatible
  8915.         42h MIPS Mark III (R4000) or compatible
  8916.  0Ah    WORD    target operating system
  8917.         01h OS/2
  8918.         02h Windows
  8919.         03h European DOS 4.0
  8920.         04h Windows 386
  8921.  0Ch    DWORD    module version
  8922.  10h    DWORD    module type (see #0951)
  8923.  14h    DWORD    number of memory pages
  8924.  18h    Initial CS:EIP
  8925.     DWORD    object number
  8926.     DWORD    offset
  8927.  20h    Initial SS:ESP
  8928.     DWORD    object number
  8929.     DWORD    offset
  8930.  28h    DWORD    memory page size
  8931.  2Ch    DWORD    (Windows LE) bytes on last page
  8932.         (OS/2 LX) page offset shift count
  8933.  30h    DWORD    fixup section size
  8934.  34h    DWORD    fixup section checksum
  8935.  38h    DWORD    loader section size
  8936.  3Ch    DWORD    loader section checksum
  8937.  40h    DWORD    offset of object table (see #0952)
  8938.  44h    DWORD    object table entries
  8939.  48h    DWORD    object page map table offset (see #0954)
  8940.  4Ch    DWORD    object iterate data map offset
  8941.  50h    DWORD    resource table offset
  8942.  54h    DWORD    resource table entries
  8943.  58h    DWORD    resident names table offset (see #0955)
  8944.  5Ch    DWORD    entry table offset (see #0956,#0957)
  8945.  60h    DWORD    module directives table offset
  8946.  64h    DWORD    Module Directives entries
  8947.  68h    DWORD    Fixup page table offset
  8948.  6Ch    DWORD    Fixup record table offset (see #0959)
  8949.  70h    DWORD    imported modules name table offset
  8950.  74h    DWORD    imported modules count
  8951.  78h    DWORD    imported procedures name table offset
  8952.  7Ch    DWORD    per-page checksum table offset
  8953.  80h    DWORD    data pages offset
  8954.  84h    DWORD    preload page count
  8955.  88h    DWORD    non-resident names table offset
  8956.  8Ch    DWORD    non-resident names table length
  8957.  90h    DWORD    non-resident names checksum
  8958.  94h    DWORD    automatic data object
  8959.  98h    DWORD    debug information offset
  8960.  9Ch    DWORD    debug information length
  8961.  A0h    DWORD    preload instance pages number
  8962.  A4h    DWORD    demand instance pages number
  8963.  A8h    DWORD    extra heap allocation
  8964.  ACh 12 BYTEs    reserved
  8965.  B8h    DWORD    offset of VERSIONINFO resource (MS-Windows VxD only)
  8966.  BCh    DWORD    pointer to ??? (dynamically-loadable VxDs only???)
  8967.  C0h    WORD    device ID (MS-Windows VxD only)
  8968.  C2h    WORD    DDK version (MS-Windows VxD only)
  8969. Note:    used by EMM386.EXE, QEMM, and Windows 3.0 Enhanced Mode drivers
  8970.  
  8971. Bitfields for Linear Executable module type:
  8972. Bit(s)    Description    (Table 0951)
  8973.  2    initialization (only for DLLs) 0 = global, 1 = per-process
  8974.  4    no internal fixups in executable image
  8975.  5    no external fixups in executable image
  8976.  8-10    API compatibility
  8977.     0 = unknown
  8978.     1 = incompatible with PM windowing \
  8979.     2 = compatible with PM windowing    > (only for
  8980.     3 = uses PM windowing API       /    programs)
  8981.  13    module not loadable (only for programs)
  8982.  15-17    module type
  8983.     000 program
  8984.     001 library (DLL)
  8985.     011 protected memory library module
  8986.     100 physical device driver
  8987.     110 virtual device driver
  8988.  30    per-process library termination
  8989.     (requires valid CS:EIP, can't be set for .EXE)
  8990.  
  8991. Format of object table entry:
  8992. Offset    Size    Description    (Table 0952)
  8993.  00h    DWORD    virtual size in bytes
  8994.  04h    DWORD    relocation base address
  8995.  08h    DWORD    object flags (see #0953)
  8996.  0Ch    DWORD    page map index
  8997.  10h    DWORD    page map entries (see #0954)
  8998.  14h  4 BYTEs    reserved??? (apparently always zeros)
  8999.  
  9000. Bitfields for object flags:
  9001. Bit(s)    Description    (Table 0953)
  9002.  0    readable
  9003.  1    writable
  9004.  2    executable
  9005.  3    resource
  9006.  4    discardable
  9007.  5    shared
  9008.  6    preloaded
  9009.  7    invalid
  9010.  8-9    type
  9011.     00 normal
  9012.     01 zero-filled
  9013.     10 resident
  9014.     11 resident and contiguous
  9015.  10    resident and long-lockable
  9016.  11    reserved
  9017.  12    16:16 alias required
  9018.  13    "BIG" (Huge: 32-bit)
  9019.  14    conforming
  9020.  15    "OBJECT_I/O_PRIVILEGE_LEVEL"
  9021.  16-31    reserved
  9022.  
  9023. Format of object page map table entry:
  9024. Offset    Size    Description    (Table 0954)
  9025.  00h    BYTE    ??? (usually 00h)
  9026.  01h    WORD    (big-endian) index to fixup table
  9027.         0000h if no relocation info
  9028.  03h    BYTE    type (00h hard copy in file, 03h some relocation needed)
  9029.  
  9030. Format of resident names table entry:
  9031. Offset    Size    Description    (Table 0955)
  9032.  00h    BYTE    length of name
  9033.  01h  N BYTEs    name
  9034.  N+1  3 BYTEs    ???
  9035.  
  9036. Format of LE linear executable entry table:
  9037. Offset    Size    Description    (Table 0956)
  9038.  00h    BYTE    number of entries in table
  9039.  01h 10 BYTEs per entry
  9040.         Offset    Size    Description
  9041.          00h    BYTE    bit flags
  9042.                 bit 0: non-empty bundle
  9043.                 bit 1: 32-bit entry
  9044.          01h    WORD    object number
  9045.          03h    BYTE    entry type flags
  9046.                 bit 0: exported
  9047.                 bit 1: uses single data rather than instance
  9048.                 bit 2: reserved
  9049.                 bits 3-7: number of stack parameters
  9050.          04h    DWORD    offset of entry point
  9051.          08h  2 BYTEs    ???
  9052. Note:    empty bundles (bit flags at 00h = 00h) are used to skip unused indices,
  9053.       and do not contain the remaining nine bytes
  9054.  
  9055. Format of LX linear executable entry table [array]:
  9056. Offset    Size    Description    (Table 0957)
  9057.  00h    BYTE    number of bundles following (00h = end of entry table)
  9058.  01h    BYTE    bundle type
  9059.         00h empty
  9060.         01h 16-bit entry
  9061.         02h 286 callgate entry
  9062.         03h 32-bit entry
  9063.         04h forwarder entry
  9064.         bit 7 set if additional parameter typing information is present
  9065. ---bundle type 00h---
  9066.  no additional fields
  9067. ---bundle type 01h---
  9068.  02h    WORD    object number
  9069.  04h    BYTE    entry flags
  9070.         bit 0: exported
  9071.         bits 7-3: number of stack parameters
  9072.  05h    WORD    offset of entry point in object (shifted by page size shift)
  9073. ---bundle type 02h---
  9074.  02h    WORD    object number
  9075.  04h    BYTE    entry flags
  9076.         bit 0: exported
  9077.         bits 7-3: number of stack parameters
  9078.  05h    WORD    offset of entry point in object
  9079.  07h    WORD    reserved for callgate selector (used by loader)
  9080. ---bundle type 03h---
  9081.  02h    WORD    object number
  9082.  04h    BYTE    entry flags
  9083.         bit 0: exported
  9084.         bits 7-3: number of stack parameters
  9085.  05h    DWORD    offset of entry point in object
  9086. ---bundle type 04h---
  9087.  02h    WORD    reserved
  9088.  04h    BYTE    forwarder flags
  9089.         bit 0: import by ordinal
  9090.         bits 7-1 reserved
  9091.  05h    WORD    module ordinal
  9092.         (forwarder's index into Import Module Name table)
  9093.  07h    DWORD    procedure name offset or import ordinal number
  9094. Note:    all fields after the first two bytes are repeated N times
  9095.  
  9096. Bitfields for linear executable fixup type:
  9097. Bit(s)    Description    (Table 0958)
  9098.  7    ordinal is BYTE rather than WORD
  9099.  6    16-rather than 8-object number/module ordinal
  9100.  5    addition with DWORD rather than WORD
  9101.  4    relocation info has size with new two bytes at end
  9102.  3    reserved (0)
  9103.  2    set if add to destination, clear to replace destination
  9104.  1-0    type
  9105.     00 internal fixup
  9106.     01 external fixup, imported by ordinal
  9107.     10 external fixup, imported by name
  9108.     11 internal fixup via entry table
  9109.  
  9110. Format of linear executable fixup record:
  9111. Offset    Size    Description    (Table 0959)
  9112.  00h    BYTE    type
  9113.         bits 7-4: modifier (0001 single, 0011 multiple)
  9114.         bits 3-0: type
  9115.             0000 byte offset
  9116.             0010 word segment
  9117.             0011 16-bit far pointer (DWORD)
  9118.             0101 16-bit offset
  9119.             0110 32-bit far pointer (PWORD)
  9120.             0111 32-bit offset
  9121.             1000 near call or jump, WORD/DWORD based on seg attrib
  9122.  01h    BYTE    linear executable fixup type (see #0958)
  9123. ---if single type---
  9124.  02h    WORD    offset within page
  9125.  04h    relocation information
  9126.     ---internal fixup---
  9127.     BYTE    object number
  9128.     ---external,ordinal---
  9129.     BYTE    one-based module number in Import Module table
  9130.     BYTE/WORD ordinal number
  9131.     WORD/DWORD value to add (only present if modifier bit 4 set)
  9132.     ---external,name---
  9133.     BYTE    one-based module number in Import Module table
  9134.     WORD    offset in Import Procedure names
  9135.     WORD/DWORD value to add (only present if modifier bit 4 set)
  9136. ---if multiple type---
  9137.  02h    BYTE    number of items
  9138.  03h    var    relocation info as for "single" type (above)
  9139.       N WORDs    offsets of items to relocate
  9140.  
  9141. Format of old Phar Lap .EXP file header:
  9142. Offset    Size    Description    (Table 0960)
  9143.  00h  2 BYTEs    "MP" (4Dh 50h) signature
  9144.  02h    WORD    remainder of image size / page size (page size = 512h)
  9145.  04h    WORD    size of image in pages
  9146.  06h    WORD    number of relocation items
  9147.  08h    WORD    header size in paragraphs
  9148.  0Ah    WORD    minimum number of extra 4K pages to be allocated at the end
  9149.           of program, when it is loaded
  9150.  0Ch    WORD    maximum number of extra 4K pages to be allocated at the end
  9151.           of program, when it is loaded
  9152.  0Eh    DWORD    initial ESP
  9153.  12h    WORD    word checksum of file
  9154.  14h    DWORD    initial EIP
  9155.  18h    WORD    offset of first relocation item
  9156.  1Ah    WORD    overlay number
  9157.  1Ch    WORD    ??? (wants to be 1)
  9158. SeeAlso: #0961
  9159.  
  9160. Format of new Phar Lap .EXP file header:
  9161. Offset    Size    Description    (Table 0961)
  9162.  00h  2 BYTEs    signature ("P2" for 286 .EXP executable, "P3" for 386 .EXP)
  9163.  02h    WORD    level (01h flat-model file, 02h multisegmented file)
  9164.  04h    WORD    header size
  9165.  06h    DWORD    file size in bytes
  9166.  0Ah    WORD    checksum
  9167.  0Ch    DWORD    offset of run-time parameters within file (see #0963)
  9168.  10h    DWORD    size of run-time parameters in bytes
  9169.  14h    DWORD    offset of relocation table within file
  9170.  18h    DWORD    size of relocation table in bytes
  9171.  1Ch    DWORD    offset of segment information table within file (see #0962)
  9172.  20h    DWORD    size of segment information table in bytes
  9173.  24h    WORD    size of segment information table entry in bytes
  9174.  26h    DWORD    offset of load image within file
  9175.  2Ah    DWORD    size of load image on disk
  9176.  2Eh    DWORD    offset of symbol table within file or 00000000h
  9177.  32h    DWORD    size of symbol table in bytes
  9178.  36h    DWORD    offset of GDT within load image
  9179.  3Ah    DWORD    size of GDT in bytes
  9180.  3Eh    DWORD    offset of LDT within load image
  9181.  42h    DWORD    size of LDT in bytes
  9182.  46h    DWORD    offset of IDT within load image
  9183.  4Ah    DWORD    size of IDT in bytes
  9184.  4Eh    DWORD    offset of TSS within load image
  9185.  52h    DWORD    size of TSS in bytes
  9186.  56h    DWORD    minimum number of extra bytes to be allocated at end of program
  9187.         (level 1 executables only)
  9188.  5Ah    DWORD    maximum number of extra bytes to be allocated at end of program
  9189.         (level 1 executables only)
  9190.  5Eh    DWORD    base load offset (level 1 executables only)
  9191.  62h    DWORD    initial ESP
  9192.  66h    WORD    initial SS
  9193.  68h    DWORD    initial EIP
  9194.  6Ch    WORD    initial CS
  9195.  6Eh    WORD    initial LDT
  9196.  70h    WORD    initial TSS
  9197.  72h    WORD    flags
  9198.         bit 0: load image is packed
  9199.         bit 1: 32-bit checksum is present
  9200.         bits 4-2: type of relocation table
  9201.  74h    DWORD    memory requirements for load image
  9202.  78h    DWORD    32-bit checksum (optional)
  9203.  7Ch    DWORD    size of stack segment in bytes
  9204.  80h 256 BYTEs    reserved (0)
  9205. SeeAlso: #0960,#0964
  9206.  
  9207. Format of Phar Lap segment information table entry:
  9208. Offset    Size    Description    (Table 0962)
  9209.  00h    WORD    selector number
  9210.  02h    WORD    flags
  9211.  04h    DWORD    base offset of selector
  9212.  08h    DWORD    minimum number of extra bytes to be allocated to the segment
  9213.  
  9214. Format of 386|DOS-Extender run-time parameters:
  9215. Offset    Size    Description    (Table 0963)
  9216.  00h  2 BYTEs    signature "DX" (44h 58h)
  9217.  02h    WORD    minimum number of real-mode params to leave free at run time
  9218.  04h    WORD    maximum number of real-mode params to leave free at run time
  9219.  06h    WORD    minimum interrupt buffer size in KB
  9220.  08h    WORD    maximum interrupt buffer size in KB
  9221.  0Ah    WORD    number of interrupt stacks
  9222.  0Ch    WORD    size in KB of each interrupt stack
  9223.  0Eh    DWORD    offset of byte past end of real-mode code and data
  9224.  12h    WORD    size in KB of call buffers
  9225.  14h    WORD    flags
  9226.         bit 0: file is virtual memory manager
  9227.         bit 1: file is a debugger
  9228.  16h    WORD    unprivileged flag (if nonzero, executes at ring 1, 2, or 3)
  9229.  18h 104 BYTEs    reserved (0)
  9230.  
  9231. Format of Phar Lap repeat block header:
  9232. Offset    Size    Description    (Table 0964)
  9233.  00h    WORD    byte count
  9234.  02h    BYTE    repeat string length
  9235.  
  9236. Format of Borland debugging information header (following load image):
  9237. Offset    Size    Description    (Table 0965)
  9238.  00h    WORD    signature 52FBh
  9239.  02h    WORD    version ID
  9240.  04h    DWORD    size of name pool in bytes
  9241.  08h    WORD    number of names in name pool
  9242.  0Ah    WORD    number of type entries
  9243.  0Ch    WORD    number of structure members
  9244.  0Eh    WORD    number of symbols
  9245.  10h    WORD    number of global symbols
  9246.  12h    WORD    number of modules
  9247.  14h    WORD    number of locals (optional)
  9248.  16h    WORD    number of scopes in table
  9249.  18h    WORD    number of line-number entries
  9250.  1Ah    WORD    number of include files
  9251.  1Ch    WORD    number of segment records
  9252.  1Eh    WORD    number of segment/file correlations
  9253.  20h    DWORD    size of load image after removing uninitialized data and debug
  9254.           information
  9255.  24h    DWORD    debugger hook; pointer into debugged program whose meaning
  9256.           depends on program flags
  9257.  28h    BYTE    program flags
  9258.         bit 0: case-sensitive link
  9259.         bit 1: pascal overlay program
  9260.  29h    WORD    no longer used
  9261.  2Bh    WORD    size of data pool in bytes
  9262.  2Dh    BYTE    padding
  9263.  2Eh    WORD    size of following header extension (currently 00h, 10h, or 20h)
  9264.  30h    WORD    number of classes
  9265.  32h    WORD    number of parents
  9266.  34h    WORD    number of global classes (currently unused)
  9267.  36h    WORD    number of overloads (currently unused)
  9268.  38h    WORD    number of scope classes
  9269.  3Ah    WORD    number of module classes
  9270.  3Ch    WORD    number of coverage offsets
  9271.  3Eh    DWORD    offset relative to symbol base of name pool
  9272.  42h    WORD    number of browser information records
  9273.  44h    WORD    number of optimized symbol records
  9274.  46h    WORD    debugging flags
  9275.  48h  8 BYTEs    padding
  9276. Note:    additional information on the Borland debugging info may be found in
  9277.       Borland's Open Architecture Handbook
  9278. SeeAlso: #0941
  9279. --------U-214B-------------------------------
  9280. INT 21 - ELRES v1.0 only - INSTALLATION CHECK
  9281.     AH = 4Bh
  9282.     DS:DX = 0000h:0000h
  9283. Return: ES:BX -> ELRES history structure (see #0728 at AH=2Bh/CX=454Ch)
  9284.     DX = DABEh (signature, DAve BEnnett)
  9285. Program: ELRES is an MS-DOS return code (errorlevel) recorder by David H.
  9286.       Bennett
  9287. SeeAlso: AH=2Bh/CX=454Ch
  9288. --------v-214B04-----------------------------
  9289. INT 21 - VIRUS - "MG", "699"/"Thirteen Minutes" - INSTALLATION CHECK
  9290.     AX = 4B04h
  9291. Return: CF clear if "MG" resident
  9292.     AX = 044Bh if "699"/"Thirteen Minutes" resident
  9293. SeeAlso: AX=4243h,AH=4Ah/BX=FFFFh,AX=4B21h
  9294. --------D-214B05-----------------------------
  9295. INT 21 - DOS 5+ - SET EXECUTION STATE
  9296.     AX = 4B05h
  9297.     DS:DX -> execution state structure (see #0966)
  9298. Return: CF clear if successful
  9299.         AX = 0000h
  9300.     CF set on error
  9301.         AX = error code (see #1020 at AH=59h/BX=0000h)
  9302. Note:    used by programs which intercept AX=4B00h to prepare new programs for
  9303.       execution (including setting the DOS version number).     No DOS, BIOS
  9304.       or other software interrupt may be called after return from this call
  9305.       before commencement of the child process.  If DOS is running in the
  9306.       HMA, A20 is turned off on return from this call.
  9307. SeeAlso: AH=4Bh
  9308.  
  9309. Format of execution state structure:
  9310. Offset    Size    Description    (Table 0966)
  9311.  00h    WORD    reserved (00h)
  9312.  02h    WORD    type flags
  9313.         bit 0: program is an .EXE
  9314.         bit 1: program is an overlay
  9315.  04h    DWORD    pointer to ASCIZ name of program file
  9316.  08h    WORD    PSP segment of new program
  9317.  0Ah    DWORD    starting CS:IP of new program
  9318.  0Eh    DWORD    program size including PSP
  9319. --------v-214B20-----------------------------
  9320. INT 21 - VIRUS - "Holocaust"/"Telefonica" - ???
  9321.     AX = 4B20h
  9322. SeeAlso: AX=4B04h,AX=4B21h
  9323. --------v-214B21-----------------------------
  9324. INT 21 C - VIRUS - "Holocaust"/"Telefonica" - ???
  9325.     AX = 4B21h
  9326. Note:    called at completion of virus installation
  9327. SeeAlso: AX=4B04h,AX=4B20h,AX=4B25h
  9328. --------v-214B25-----------------------------
  9329. INT 21 - VIRUS - "1063"/"Mono" - INSTALLATION CHECK
  9330.     AX = 4B25h
  9331. Return: DI = 1234h if resident
  9332. SeeAlso: AX=4B21h,AX=4B40h
  9333. --------v-214B40-----------------------------
  9334. INT 21 - VIRUS - "Plastique"/"AntiCad" - INSTALLATION CHECK
  9335.     AX = 4B40h
  9336. Return: AX = 5678h if resident
  9337. SeeAlso: AX=4B25h,AX=4B41h,AX=4B4Ah
  9338. --------v-214B41-----------------------------
  9339. INT 21 - VIRUS - "Plastique"/"AntiCad" - ???
  9340.     AX = 4B41h
  9341.     ???
  9342. Return: ???
  9343. SeeAlso: AX=4B40h
  9344. --------v-214B4A-----------------------------
  9345. INT 21 - VIRUS - "Jabberwocky" - INSTALLATION CHECK
  9346.     AX = 4B4Ah
  9347. Return: AL = 57h if resident
  9348. SeeAlso: AX=4B40h,AX=4B4Bh
  9349. --------v-214B4B-----------------------------
  9350. INT 21 - VIRUS - "Horse-2" - INSTALLATION CHECK
  9351.     AX = 4B4Bh
  9352. Return: CF clear if resident
  9353. SeeAlso: AX=4B4Ah,AX=4B4Dh
  9354. --------v-214B4D-----------------------------
  9355. INT 21 - VIRUS - "Murphy-2", "Patricia"/"Smack" - INSTALLATION CHECK
  9356.     AX = 4B4Dh
  9357. Return: CF clear if resident
  9358. SeeAlso: AX=4B4Ah,AX=4B50h
  9359. --------v-214B50-----------------------------
  9360. INT 21 - VIRUS - "Plastique-2576"/"AntiCad-2576" - INSTALLATION CHECK
  9361.     AX = 4B50h
  9362. Return: AX = 1234h if resident
  9363. SeeAlso: AX=4B4Dh,AX=4B53h,AX=4B60h
  9364. --------v-214B53-----------------------------
  9365. INT 21 - VIRUS - "Horse" - INSTALLATION CHECK
  9366.     AX = 4B53h
  9367. Return: CF clear if resident
  9368. SeeAlso: AX=4B50h,AX=4B53h/BX=2121h,AX=4B55h
  9369. --------v-214B53BX2121-----------------------
  9370. INT 21 - VIRUS - "One Half" - INSTALLATION CHECK
  9371.     AX = 4B53h
  9372.     BX = 2121h
  9373.     CX = 1212h
  9374.     DX = 0236h
  9375. Return: AX = 454Bh if installed
  9376. SeeAlso: AX=4B50h,AX=4B53h,AX=4B55h
  9377. --------v-214B55-----------------------------
  9378. INT 21 - VIRUS - "Sparse" - INSTALLATION CHECK
  9379.     AX = 4B55h
  9380. Return: AX = 1231h if resident
  9381. SeeAlso: AX=4B53h,AX=4B59h
  9382. --------v-214B59-----------------------------
  9383. INT 21 - VIRUS - "Murphy-1", "Murphy-4" - INSTALLATION CHECK
  9384.     AX = 4B59h
  9385. Return: CF clear if resident
  9386. SeeAlso: AX=4B50h,AX=4B5Eh
  9387. --------v-214B5E-----------------------------
  9388. INT 21 - VIRUS - "Brothers" - INSTALLATION CHECK
  9389.     AX = 4B5Eh
  9390. Return: CF clear if resident
  9391. SeeAlso: AX=4B59h,AX=4B87h
  9392. --------v-214B60-----------------------------
  9393. INT 21 - VIRUS - "Plastique-2576"/"AntiCad-2576" - ???
  9394.     AX = 4B60h
  9395.     ???
  9396. Return: ???
  9397. SeeAlso: AX=4B50h
  9398. --------O-214B80-----------------------------
  9399. INT 21 - DR-DOS v3.41 - RUN ALREADY-LOADED KERNEL FILE
  9400.     AX = 4B80h
  9401.     DS:DX -> ASCIZ name of program to EXEC
  9402.     ES = segment of PSP for kernel file
  9403. Return: only if call failed
  9404. Note:    DR-DOS uses this call after an AX=4B01h to load the kernel file into
  9405.       memory and patching the program's parent-PSP field to point at itself
  9406. SeeAlso: AH=4Bh"EXEC"
  9407. --------v-214B87-----------------------------
  9408. INT 21 - VIRUS - "Shirley" - INSTALLATION CHECK
  9409.     AX = 4B87h
  9410. Return: AX = 6663h if resident
  9411. SeeAlso: AX=4B5Eh,AX=4B95h
  9412. --------v-214B95-----------------------------
  9413. INT 21 - VIRUS - "Zherkov-1882" - INSTALLATION CHECK
  9414.     AX = 4B95h
  9415. Return: AX = 1973h if resident
  9416. SeeAlso: AX=4B87h,AX=4BA7h
  9417. --------v-214BA7-----------------------------
  9418. INT 21 - VIRUS - "1876"/"Dash-em" - INSTALLATION CHECK
  9419.     AX = 4BA7h
  9420. Return: AX = B459h if resident
  9421. SeeAlso: AX=4B95h,AX=4BAAh
  9422. --------v-214BAA-----------------------------
  9423. INT 21 - VIRUS - "Nomenklatura" - INSTALLATION CHECK
  9424.     AX = 4BAAh
  9425. Return: CF clear if resident
  9426. SeeAlso: AX=4BA7h,AX=4BAFh
  9427. --------v-214BAF-----------------------------
  9428. INT 21 - VIRUS - "948"/"Screenplus1", "Magnitogorsk" - INSTALLATION CHECK
  9429.     AX = 4BAFh
  9430. Return: AL = AFh if "Magnitogorsk" resident
  9431.     AL = FAh if "948"/"Screenplus1" resident
  9432. SeeAlso: AX=4BAAh,AX=4BB1h"VIRUS"
  9433. --------v-214BB1-----------------------------
  9434. INT 21 - VIRUS - "UZZY" -INSTALLATION CHECK
  9435.     AX = 4BB1h
  9436. Return: CL = 04h if resident
  9437. SeeAlso: AX=4BAFh"VIRUS",AX=4BDDh"VIRUS"
  9438. --------v-214BDD-----------------------------
  9439. INT 21 - VIRUS - "Lozinsky"/"Zherkov" - INSTALLATION CHECK
  9440.     AX = 4BDDh
  9441. Return: AX = 1234h
  9442. SeeAlso: AX=4BB1h"VIRUS",AX=4BFEh
  9443. --------v-214BEE-----------------------------
  9444. INT 21 - F-DRIVER.SYS v1.14+ - GRAB INT 21
  9445.     AX = 4BEEh
  9446. Return: AX = status
  9447.         1234h grab was successful
  9448.         2345h failed (INT 21 grabbed previously)
  9449. Program: F-DRIVER.SYS is part of the shareware F-PROT virus/trojan protection
  9450.       package by Fridrik Skulason
  9451. Note:    when called the first time, this function moves the INT 21 monitoring
  9452.       code from its original location in the INT 21 chain to be the first
  9453.       thing called by INT 21.  This is the mechanism used by F-NET.
  9454. SeeAlso: INT 2F/AX=4653h/CX=0002h,INT 2F/AX=4653h/CX=0007h
  9455. --------k-214BF0-----------------------------
  9456. INT 21 - DIET v1.10+ (Overlay Mode) - INSTALLATION CHECK
  9457.     AX = 4BF0h
  9458. Return: CF clear if installed
  9459.         AX = 899Dh
  9460. Program: DIET is an executable-compression program by Teddy Matsumoto
  9461. SeeAlso: AX=37D0h,AX=4BF1h
  9462. --------k-214BF1-----------------------------
  9463. INT 21 - DIET v1.10+ (Overlay Mode) - EXPAND PROGRAM???
  9464.     AX = 4BF1h
  9465. Return: ???
  9466. SeeAlso: AX=37D0h,AX=4BF0h
  9467. --------v-214BF1-----------------------------
  9468. INT 21 - VIRUS - "Jerusalem 2" - INSTALLATION CHECK
  9469.     AX = 4BF1h
  9470. Return: AX = 1FB4h if resident
  9471. SeeAlso: AH=3Fh/BX=FEB0h"VIRUS",AX=4BDDh"VIRUS",AX=4BFEh"VIRUS"
  9472. --------v-214BFE-----------------------------
  9473. INT 21 - VIRUS - "Hitchcock", "Dark Avenger-1028", "1193" - INSTALLATION CHECK
  9474.     AX = 4BFEh
  9475. Return: AX = 1234h if "Hitchcock" or "Storm" resident
  9476.     AX = ABCDh if "1193"/"Copyright" resident
  9477.     DI = 55BBh if "Dark Avenger-1028" resident
  9478. SeeAlso: AX=4BDDh,AX=4BF1h"VIRUS",AX=4BFFh"Justice"
  9479. --------v-214BFF-----------------------------
  9480. INT 21 - VIRUS - "USSR-707", "Justice", "Europe 92" - INSTALLATION CHECK
  9481.     AX = 4BFFh
  9482. Return: BL = FFh if "USSR-707" resident
  9483.     DI = 55AAh if "Justice" resident
  9484.     AX = 1234h if "Hitchcock.1238" resident
  9485.     CF clear if "Europe 92" resident
  9486. SeeAlso: AX=4BFEh,AX=4BFFh"Cascade",AX=5252h
  9487. --------v-214BFFSI0000-----------------------
  9488. INT 21 - VIRUS - "Cascade" - INSTALLATION CHECK
  9489.     AX = 4BFFh
  9490.     SI = 0000h
  9491.     DI = 0000h
  9492. Return: DI = 55AAh if installed
  9493. SeeAlso: AX=4BFFh"Justice",AX=5252h
  9494. --------!---Section--------------------------
  9495.